home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 32 / Amiga Format AFCD32 (Nov 1998, Issue 117).iso / -seriously_amiga- / programming / other / hrtmon / src / hrtmonv2.s < prev    next >
Text File  |  1998-08-10  |  226KB  |  12,087 lines

  1.  
  2. ;HRTmon Amiga system monitor
  3. ;Copyright (C) 1991-1998 Alain Malek Alain.Malek@cryogen.com
  4. ;
  5. ;This program is free software; you can redistribute it and/or
  6. ;modify it under the terms of the GNU General Public License
  7. ;as published by the Free Software Foundation; either version 2
  8. ;of the License, or (at your option) any later version.
  9. ;
  10. ;This program is distributed in the hope that it will be useful,
  11. ;but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. ;GNU General Public License for more details.
  14. ;
  15. ;You can find the full GNU GPL online at: http://www.gnu.org
  16.  
  17.  
  18. *******************************
  19. **        HRTmon v2.21       **
  20. *******************************
  21. **   code by Alain Malek    ***
  22. *******************************
  23.  
  24. version    macro
  25.     dc.b "2.21"
  26.     endm
  27.  
  28. ***********************************************************
  29.  
  30.     IFD BARFLY
  31. WHDLOAD
  32.         MC68030
  33.         SUPER            ;disable supervisor warnings
  34.         BOPT w4-        ;disable 64k warnings
  35.         OUTPUT "hrtmon.data"
  36.  
  37. OPT_OFF        MACRO
  38.         BOPT OD6-        ;disable branch optimizing
  39.         ENDM
  40. OPT_ON        MACRO
  41.         BOPT OD6+        ;enable branch optimizing
  42.         ENDM
  43.  
  44.     ENDC
  45.  
  46.     IFD _PHXASS_
  47.         MC68030
  48.         OPT NBL
  49.  
  50. OPT_OFF        MACRO
  51.         OPT 0
  52.         ENDM
  53. OPT_ON        MACRO
  54.         OPT NBL
  55.         ENDM
  56.  
  57.     ENDC
  58.  
  59.     IFND BARFLY
  60.     IFND _PHXASS_
  61.  
  62. MC68000    MACRO
  63.     ENDM
  64. MC68030    MACRO
  65.     ENDM
  66. MC68040    MACRO
  67.     ENDM
  68.  
  69. OPT_ON    MACRO
  70.     ENDM
  71. OPT_OFF    MACRO
  72.     ENDM
  73.  
  74.     ENDC
  75.     ENDC
  76.  
  77. ***********************************************************
  78.  
  79.  
  80. SC_STEP equ 16        ;fast scrolling step
  81.  
  82. PICSIZE equ $9800    ;size of mem used for bitmap ( > MAX_SCREEN*h*80 )
  83.  
  84. MAX_SCREEN equ 52
  85.  
  86.  
  87.     incdir include:
  88.     include exec/tasks.i
  89.     include hardware/custom.i
  90.  
  91. ***********************************************************
  92.  
  93.     include exec/types.i
  94.     include exec/execbase.i
  95.     include devices/hardblocks.i
  96.  
  97.     incdir hrt:
  98.  
  99. ***********************************************************
  100. ;-------------- MACRO same as reloc_pic subroutine --------
  101.  
  102. RELOC_PIC:    macro
  103.         cmp.l    #$40000,a4
  104.         bcs.b    .low\1
  105. ;-------------- bitmap needs to be in $20000 ---------
  106.         cmp.l    #$20000,pic_ptr
  107.         beq.b    .ok_corr\1
  108.         bra.b    .doreloc\1
  109.  
  110. ;-------------- bitmap needs to be in $60000 ---------
  111. .low\1        cmp.l    #$60000,pic_ptr
  112.         beq.b    .ok_corr\1
  113. .doreloc\1    jsr    reloc_pic
  114. .ok_corr\1
  115.         endm
  116.  
  117. ***********************************************************
  118.  
  119. start        ;bra.w    monitor
  120.         moveq    #0,d0
  121.         rts
  122.         dc.b "HRT!"        ;4
  123.  
  124.     OPT_OFF
  125.         bra.w    mon_install    ;8  jmp to install routine
  126.         bra.w    monitor        ;12 jmp to monitor
  127.         bra.w    mon_remove    ;16 jmp to remove routine
  128.     OPT_ON
  129. mon_size    dc.l 0            ;20 size of HRTmon (for FreeMem)
  130. color0        dc.w 0            ;24 color0
  131. color1        dc.w $eee        ;26 color1
  132. config_RM    dc.b 0            ;28 -1=right-mouse enter on 0=off
  133. config2        dc.b 0            ;29 no of keyboard to use
  134. config_key    dc.b 0            ;30 -1= \ key enter on 0=off
  135. config_IDE    dc.b 0            ;31 -1= IDE harddisk
  136. config_A1200    dc.b 0            ;32 -1= A1200
  137. config_AGA    dc.b 0            ;33 -1= AGA
  138. config_insert    dc.b 0            ;34 -1= insert
  139. config_delay    dc.b 15            ;35 repeat key delay (default = 15)
  140. config_lview    dc.b 0            ;36 -1= lview task
  141. config_elsat    dc.b 0            ;37 -1=elsat.device IDE (CD32)
  142. config_screen    dc.b 0            ;38 screen mode no 0=PAL,1=NTSC,2=MULTISCAN
  143. config_novbr    dc.b 0            ;39 0=move vbr, -1=don't move vbr
  144. entered        dc.b 0            ;40 bit 0 set if in HRTmon
  145.         even
  146.  
  147.  
  148. mon_remove    movem.l    d1-a6,-(a7)
  149.         move.l    $4.w,a6
  150.         lea.l    .super(pc),a5
  151.         jsr    -30(a6)
  152.  
  153.         move.l    mon_size(pc),d0
  154.         beq.b    .nofree
  155.         lea.l    start(pc),a1
  156.         jsr    -210(a6)    ;FreeMem
  157. .nofree
  158.         tst.b    config_lview
  159.         beq.b    .nolview
  160.         move.l    $4.w,a6
  161.         move.l    gfxbase(pc),a1
  162.         jsr    -414(a6)
  163.  
  164.         lea.l    tc_block(pc),a1
  165.         jsr    -288(a6)    ;RemTask
  166.  
  167. .nolview
  168.         movem.l    (a7)+,d1-a6
  169.         moveq    #0,d0
  170.         rts
  171.  
  172. .super
  173.         sub.l    a4,a4
  174.         tst.w    proc_type
  175.         beq.b    .go68000
  176.         movec    vbr,a4
  177. .go68000
  178.         move.l    a4,a3
  179.  
  180.         lea.l    backup_vbr,a0
  181.         move.w    #$400/4-1,d0
  182. .loop        move.l    (a4),a1
  183.         cmp.l    #start,a1    ;check if vector points in HRTmon
  184.         bcs.b    .norestore
  185.         cmp.l    #end,a1
  186.         bcc.b    .norestore
  187.         move.l    (a0),(a4)
  188. .norestore    addq.l    #4,a0
  189.         addq.l    #4,a4
  190.         dbf    d0,.loop
  191.  
  192.         cmp.l    #new_except,a3
  193.         bne.b    .novbr
  194.         move.l    old_vbr(pc),a3
  195.         movec    a3,vbr
  196. .novbr
  197.         rte
  198.  
  199.  
  200. mon_install    movem.l    d1-a6,-(a7)
  201.  
  202.         lea.l    start(pc),a0
  203.  
  204.         move.w    #28,screen_height
  205.         cmp.b    #1,config_screen
  206.         bne.b    .nontsc
  207.         move.w    #22,screen_height
  208. .nontsc        cmp.b    #2,config_screen
  209.         bne.b    .nomulti
  210.         move.w    #52,screen_height
  211. .nomulti
  212.  
  213.         move.w    #MAX_SCREEN,d2
  214.         sub.w    screen_height,d2
  215.         mulu    #80,d2
  216.         move.l    d2,d1
  217.         add.l    #ascII_page1,d1
  218.         move.l    d1,ascII_ptr
  219.         move.l    d1,ascII_ptr+4
  220.         move.l    d2,d1
  221.         add.l    #ascII_page2,d1
  222.         move.l    d1,ascII_ptr+8
  223.         move.l    d2,d1
  224.         add.l    #ascII_Tracer,d1
  225.         move.l    d1,ascII_ptr+12
  226.  
  227.         move.w    screen_height,d1
  228.         subq.w    #4,d1
  229.         move.w    d1,window_bot
  230.  
  231.         move.l    a0,location
  232.         move.l    a0,location2
  233.  
  234.         move.l    $4.w,a6
  235.         move.l    MaxLocMem(a6),max_chip
  236.  
  237.         tst.b    config_IDE
  238.         beq.w    .noide
  239.  
  240.         tst.b    config_elsat
  241.         beq.b    .noelsat
  242.  
  243.         move.l    #$eb8000,ide_base
  244.         clr.l    ide_irq
  245.         move.w    #$0,ide_data
  246.         move.w    #$100,ide_error
  247.         move.w    #$100,ide_feature
  248.         move.w    #$200,ide_secnt
  249.         move.w    #$300,ide_secnb
  250.         move.w    #$400,ide_cyllo
  251.         move.w    #$500,ide_cylhi
  252.         move.w    #$600,ide_dhead
  253.         move.w    #$700,ide_status
  254.         move.w    #$700,ide_command
  255.         move.w    #$4600,ide_altstat
  256.         bra.w    .noide
  257.  
  258. .noelsat    move.w    #$0,ide_data
  259.         move.w    #$4,ide_error
  260.         move.w    #$4,ide_feature
  261.         move.w    #$8,ide_secnt
  262.         move.w    #$c,ide_secnb
  263.         move.w    #$10,ide_cyllo
  264.         move.w    #$14,ide_cylhi
  265.         move.w    #$18,ide_dhead
  266.         move.w    #$1c,ide_status
  267.         move.w    #$1c,ide_command
  268.         move.w    #$1c,ide_altstat
  269.  
  270.         move.l    #$da2000,ide_base
  271.         move.l    #$da9000,ide_irq
  272.         tst.b    config_A1200        ;A1200 ?
  273.         bne.b    .noide
  274.         move.l    #$dd2020,ide_base
  275.         move.l    #$dd3020,ide_irq
  276. .noide
  277.         move.b    config_insert(pc),insert_mode
  278.  
  279.         moveq    #0,d0
  280.         move.b    config2,d0        ;keyboard map
  281.         mulu    #12,d0
  282.         movem.l    .map(pc,d0.l),d0-d2
  283.         movem.l    d0-d2,board_ptr
  284.  
  285.         tst.b    config_lview
  286.         beq.b    .nolview
  287.         lea.l    gfxname(pc),a1
  288.         moveq    #0,d0
  289.         move.l    $4.w,a6
  290.         jsr    -552(a6)
  291.         move.l    d0,gfxbase
  292.  
  293.         move.l    #lview_name,tc_block+LN_NAME
  294.         move.b    #NT_TASK,tc_block+LN_TYPE
  295.         move.b    #8,tc_block+LN_PRI
  296.         move.l    #task_stackend,tc_block+TC_SPREG
  297.         move.l    #task_stack,tc_block+TC_SPLOWER
  298.         move.l    #task_stackend,tc_block+TC_SPUPPER
  299.  
  300.         lea.l    tc_block(pc),a1
  301.         lea.l    task_code(pc),a2
  302.         sub.l    a3,a3
  303.         jsr    -282(a6)        ;AddTask
  304.  
  305. .nolview
  306.         lea.l    .super(pc),a5
  307.         jsr    -30(a6)
  308.  
  309.         movem.l    (a7)+,d1-a6
  310.         moveq    #0,d0
  311.         rts
  312.  
  313.         cnop 0,4
  314.  
  315. .map        dc.l board3, board4, board4a
  316.         dc.l board1, board2, board2a
  317.         dc.l board5, board6, board6a
  318.         dc.l board7, board8, board8a
  319.  
  320.  
  321. .super        bsr    test_CPU
  322.         sub.l    a4,a4
  323.         move.w    d0,proc_type
  324.         beq.b    .no_vbr
  325.         movec    vbr,a4
  326. .no_vbr        move.l    a4,old_vbr
  327.         move.l    a4,a0
  328.         lea.l    backup_vbr,a1
  329.         move.w    #$400/4-1,d0
  330. .copy        move.l    (a0)+,(a1)+    ;backup vector table
  331.         dbf    d0,.copy
  332.  
  333.         tst.b    config_novbr    ;user doesn't want to move vbr ?
  334.         bne.b    .no_vbr_move
  335.         move.l    a4,d0
  336.         bne.b    .no_vbr_move    ;vbr already moved ?
  337.         tst.w    proc_type
  338.         beq.b    .no_vbr_move    ;can't move vbr (68000) ?
  339.  
  340. ;move vbr
  341.         lea.l    backup_vbr,a0
  342.         lea.l    new_except,a1
  343.         move.l    a1,a4
  344.         move.w    #$400/4-1,d0
  345. .copy2        move.l    (a0)+,(a1)+
  346.         dbf    d0,.copy2
  347.         movec    a4,vbr
  348.  
  349. .no_vbr_move
  350.         move.l    #monitor,$7c(a4)
  351.  
  352.         tst.b    config_RM
  353.         bne.b    .okRM
  354.         tst.b    config_key
  355.         beq.b    .no_entry
  356. .okRM
  357.         lea.l    $60(a4),a4
  358.         moveq    #0,d1
  359.         lea.l    except_entry(pc),a1
  360.         tst.w    proc_type
  361.         bne.b    .go10plus
  362.         moveq    #4,d1
  363.         lea.l    except_entry0(pc),a1
  364. .go10plus    moveq    #7-1,d0
  365. .loop        move.l    a1,(a4)+
  366.         add.l    d1,a1
  367.         dbf    d0,.loop
  368.  
  369. .no_entry
  370.         rte
  371.  
  372.  
  373.  
  374.         cnop    0,4
  375. gfxbase        dc.l 0
  376. wbview        dc.l 0
  377. signal_no    dc.l 0
  378. changed_disk    dcb.l 16,0
  379. gfxname        dc.b "graphics.library",0
  380. ;dosname        dc.b "dos.library",0
  381. lview_name    dc.b "HRTmon system task",0
  382.  
  383.         cnop    0,4
  384. tc_block    dcb.b TC_SIZE,0
  385. task_stack    dcb.b $400,0
  386. task_stackend
  387.  
  388. task_code
  389.         move.l    $4.w,a6
  390.         moveq    #-1,d0
  391.         jsr    -330(a6)        ; AllocSignal
  392.         move.l    d0,signal_no
  393.  
  394. .loop        move.l    signal_no(pc),d0
  395.         move.l    $4.w,a6
  396.         jsr    -318(a6)        ; Wait
  397.  
  398.         move.l    gfxbase(pc),a6
  399.  
  400.         move.l    wbview(pc),a1
  401.         jsr    -222(a6)         ; LoadView Fix view
  402.         move.l    38(a6),$dff080        ; Kick it into life
  403.  
  404.  
  405.     bra.b    .loop
  406.  
  407. ;experimental code removed should be done from a PROCESS
  408.  
  409. ;        move.l    $4.w,a6
  410. ;        lea.l    dosname(pc),a1
  411. ;        moveq    #0,d0
  412. ;        jsr    -552(a6)
  413. ;        tst.l    d0
  414. ;        beq.b    .nodos
  415. ;        move.l    d0,a6
  416. ;
  417. ;        lea.l    changed_disk(pc),a4
  418. ;        moveq    #16-1,d7
  419. ;.next        move.l    (a4)+,d0
  420. ;        beq.b    .empty
  421. ;
  422. ;        move.l    d0,a0
  423. ;        lea.l    part_name2(a0),a0
  424. ;        moveq    #0,d0
  425. ;        lea.l    .tmp_name(pc),a1
  426. ;        move.b    (a0)+,d0
  427. ;.copy        move.b    (a0)+,(a1)+
  428. ;        dbf    d0,.copy
  429. ;        move.b    #':',(a1)+
  430. ;        sf    (a1)+
  431. ;
  432. ;        clr.l    -4(a4)
  433. ;
  434. ;        move.l    d7,-(a7)
  435. ;
  436. ;        move.l    #.tmp_name,d1
  437. ;        jsr    -174(a6)        ; DeviceProc
  438. ;        tst.l    d0
  439. ;        beq.b    .err
  440. ;        move.l    d0,a3
  441. ;        move.l    a3,d1
  442. ;        moveq    #$1f,d2
  443. ;        moveq    #-1,d3
  444. ;        moveq    #0,d4
  445. ;        moveq    #0,d5
  446. ;        moveq    #0,d6
  447. ;        moveq    #0,d7
  448. ;        jsr    -240(a6)        ; DoPkt
  449. ;        tst.l    d0
  450. ;        beq.b    .err
  451. ;        move.l    a3,d1
  452. ;        moveq    #$1f,d2
  453. ;        moveq    #0,d3
  454. ;        moveq    #0,d4
  455. ;        moveq    #0,d5
  456. ;        moveq    #0,d6
  457. ;        moveq    #0,d7
  458. ;        jsr    -240(a6)        ; DoPkt
  459. ;.err
  460. ;        move.l    (a7)+,d7
  461. ;
  462. ;.empty        dbf    d7,.next
  463. ;
  464. ;        move.l    a6,a1
  465. ;        move.l    $4.w,a6
  466. ;        jsr    -414(a6)
  467. ;
  468. ;.nodos
  469. ;        bra.w    .loop
  470. ;
  471. ;        rts
  472.  
  473. ;.tmp_name    dcb.b    34,0
  474.  
  475.         cnop    0,4
  476. max_chip    dc.l 0        ;maximum value for CHIP-RAM
  477. oldlev7        dc.l 0
  478. old_vbr        dc.l 0
  479.  
  480. ;-------------- interrupt routine to catch 'key' press and right-mouse
  481. ;-------------- this routine is used only on 68000
  482.  
  483. except_entry0
  484.         OPT_OFF
  485.         bsr.w    .entry
  486.         bsr.w    .entry
  487.         bsr.w    .entry
  488.         bsr.w    .entry
  489.         bsr.w    .entry
  490.         bsr.w    .entry
  491.         bsr.w    .entry
  492.         OPT_ON
  493.  
  494. .entry
  495.         tst.b    config_RM
  496.         beq.b    .noright
  497.         btst    #10-8,$dff016
  498.         bne.b    .noright
  499.         addq.l    #4,a7
  500.         bra.w    monitor
  501. .noright
  502.         tst.b    config_key
  503.         beq.b    .nokey
  504.         cmp.b    #$e5,$bfec01
  505.         bne.b    .nokey
  506.         addq.l    #4,a7
  507.         bra.w    monitor
  508. .nokey
  509.         move.w    sr,-(a7)
  510.         move.w    #$2700,sr
  511.         move.l    2(a7),.retaddr
  512.  
  513.         move.l    a0,2(a7)
  514.  
  515.         sub.l    #except_entry0+4,.retaddr
  516.         lea.l    backup_vbr,a0
  517.         add.l    .retaddr,a0
  518.         move.l    $60(a0),.jmp_addr
  519.  
  520.         move.l    2(a7),a0
  521.  
  522.         move.l    .jmp_addr(pc),2(a7)
  523.         rte
  524.  
  525.         cnop 0,4
  526. .retaddr    dc.l 0
  527. .jmp_addr    dc.l 0
  528.  
  529.  
  530. ;-------------- interrupt routine to catch 'key' press and right-mouse
  531. ;-------------- this routine is used only on 68010+
  532.  
  533. except_entry    tst.b    config_RM
  534.         beq.b    .noright
  535.         btst    #10-8,$dff016
  536.         beq.w    monitor
  537. .noright
  538.         tst.b    config_key
  539.         beq.b    .nokey
  540.         cmp.b    #$e5,$bfec01
  541.         beq.w    monitor
  542. .nokey
  543.         move.w    sr,-(a7)
  544.         move.w    #$2700,sr
  545.         move.w    (a7)+,.newsr
  546.  
  547.         movem.l    d0/a0,-(a7)
  548.  
  549.         move.w    8+6(a7),d0
  550.         and.w    #$fff,d0
  551.         lea.l    backup_vbr,a0
  552.         add.w    d0,a0
  553.         move.l    (a0),.jmp_addr
  554.  
  555.         movem.l    (a7)+,d0/a0
  556.  
  557.         clr.w    -(a7)
  558.         move.l    .jmp_addr(pc),-(a7)
  559.         move.w    .newsr(pc),-(a7)
  560.         rte
  561.  
  562.         cnop 0,4
  563. .jmp_addr    dc.l 0
  564. .newsr        dc.w 0
  565.  
  566.         cnop 0,16
  567.  
  568. location    dc.l 0            ;HRTmon location
  569.         dc.b "HRT!"
  570. new_except    dcb.l    $100,0
  571.  
  572.         dc.b "ATZ!"
  573.         dc.l monitor            ;trap vector
  574.  
  575.         dc.b "HRTmon "
  576.         version
  577.         dc.b " "
  578.         dc.b "by Alain Malek "
  579.         dc.b "(Hornet of Alcatraz) "
  580.  
  581.         cnop 0,4
  582.  
  583. pic_ptr        dc.l $20000        ;address used for the bitplan of HRTmon
  584. h=9                    ;heights between two lines
  585.  
  586. ;-------------- init. HRTmon when entered for the 1st time ----
  587.  
  588. init_code    movem.l    d0-a6,-(a7)
  589.  
  590.         move.l    #$12345678,d0
  591.         tst.w    Reset_Flag
  592.         bne.b    .init
  593.         cmp.l    inited,d0
  594.         beq.w    .noinit
  595. .init        move.l    d0,inited
  596.  
  597.         jsr    init_ascII
  598.  
  599.         jsr    test_drive    ;test which floppy drive is present
  600.  
  601.         tst.b    drive_present+1
  602.         beq.b    .noDF1
  603.         move.l    #floppy1,floppy0    ;add DF1: partition
  604. .noDF1
  605.  
  606.         move.w    proc_type,d0
  607.         add.b    #'0',d0
  608.         move.b    d0,mc_txt+5
  609.  
  610.         jsr    init_fbuffer
  611.  
  612.         tst.b    config_IDE
  613.         beq.b    .noide
  614.  
  615.         move.l    ide_irq,d0
  616.         beq.b    .noIDEirq
  617.         move.l    d0,a3
  618.         tst.b    (a3)
  619.         bpl.b    .noIDEirq
  620.         move.l    ide_base,a3
  621.         tst.b    config_A1200
  622.         bne.b    .go1200
  623.         move.w    ide_status,d0
  624.         move.b    (a3,d0.w),d0
  625.         bra.b    .noIDEirq
  626. .go1200        jsr    wait_irq        ;remove IRQ request from IDE
  627. .noIDEirq
  628.  
  629.         jsr    find_part
  630. .noide
  631.  
  632. ;set default values for some write only custom registers
  633.  
  634.         lea.l    custom,a1
  635.         move.w    #$4489,$7e(a1)
  636.         move.w    #$20,$1dc(a1)
  637.         move.w    #$3081,$8e(a1)
  638.         move.w    #$30c1,$90(a1)
  639.         move.w    #$0038,$92(a1)
  640.         move.w    #$00d0,$94(a1)
  641.         move.w    #0,$108(a1)
  642.         move.w    #0,$10a(a1)
  643.         move.w    #0,$106(a1)
  644.         move.w    #0,$1fc(a1)
  645.         move.w    #$9200,$100(a1)
  646.         move.w    #0,$102(a1)
  647.  
  648.  
  649. .noinit        movem.l    (a7)+,d0-a6
  650.         rts
  651.  
  652.  
  653. ;test if exec is here and valid
  654. ;d0=0 ok, -1 = no system
  655.  
  656. exec_here    movem.l    d1/a0-a1,-(a7)
  657.  
  658.         move.l    $4.w,a0
  659.         move.l    a0,d0
  660.         lsr.l    #1,d0
  661.         bcs.b    .nosafe
  662.         lea.l    34(a0),a1
  663.         moveq    #0,d0
  664.         moveq    #$18-1,d1
  665. .add        add.w    (a1)+,d0
  666.         dbf    d1,.add
  667.         not.w    d0
  668.         cmp.w    82(a0),d0
  669.         bne.b    .nosafe
  670.  
  671.         moveq    #0,d0
  672.         bra.b    .ok
  673.  
  674. .nosafe        moveq    #-1,d0
  675. .ok        movem.l    (a7)+,d1/a0-a1
  676.         rts
  677.  
  678.         cnop 0,4
  679.  
  680. ;-------------- when in HRTmon VBR points here -----------------
  681.  
  682. HRTmon_vbr
  683.         dc.l error,error,recover,recover;$00-$0c
  684.         dc.l recover,recover,error,error;$10-$1c
  685.         dc.l error,error,error,error    ;$20-$2c
  686.         dc.l error,error,error,error    ;$30-$3c
  687.         dc.l error,error,error,error    ;$40-$4c
  688.         dc.l error,error,error,error    ;$50-$5c
  689.         dc.l error,error    ;$60,$64
  690.         dc.l error        ;$68
  691.         dc.l newirq        ;$6c        ;VBL irq
  692.         dc.l error        ;$70
  693.         dc.l error        ;$74
  694.         dc.l error        ;$78
  695.         dc.l .onlyret        ;$7c
  696.         dc.l error,error,error,error    ;$80-$8c
  697.         dc.l error,error,error,error    ;$90-$9c
  698.         dc.l error,error,error,error    ;$a0-$ac
  699.         dc.l error,error,error,error    ;$b0-$bc
  700.         dc.l error,error,error,error    ;$c0-$cc
  701.         dc.l error,error,error,error    ;$d0-$dc
  702.         dc.l error,error,error,error    ;$e0-$ec
  703.         dc.l error,error,error,error    ;$f0-$fc
  704.  
  705. .onlyret    rte
  706.  
  707. ;-------------- jmp here if an unexpected exception is raised ----------
  708. ;-------------- (should never happen !) --------------------------------
  709.  
  710. error        move.w    #$2700,sr
  711.         move.l    2(a7),start
  712.         move.w    (a7),start+4
  713.         move.w    6(a7),start+6
  714. .loop        move.w    #0,$dff106
  715.         move.w    $dff006,$dff180        ;flash screen
  716.         bra.b    .loop
  717.  
  718. ;-------------- jmp here if an unexpected exception is raised ----------
  719. ;-------------- will try to recover from error  ------------------------
  720.  
  721. recover        move.w    #$2700,sr
  722.         tst.b    cmd_executed
  723.         beq.b    error
  724.         move.l    a7,a0
  725.         lea.l    crash_stack,a1
  726.         move.w    #$100/2-1,d0
  727. .copy        move.w    (a0)+,(a1)+
  728.         cmp.l    #stack,a0
  729.         dbhs    d0,.copy
  730.         st    cmd_crashed
  731.         bra.w    end_command
  732.  
  733.         cnop 0,4
  734.  
  735. **************************************************************************
  736. ;-------------- Entry point of HRTmon ------------------------------------
  737.  
  738.         cnop 0,4
  739.  
  740. location2    dc.l 0            ;HRTmon location
  741.         dc.b "HRT!"
  742. monitor:    move.l    a0,-(a7)
  743.         lea.l    entered(pc),a0
  744.         bset    #0,(a0)
  745.         beq.b    .enter
  746.         move.l    (a7)+,a0
  747.         rte                ;don't enter twice
  748.  
  749. .enter
  750.         move.l    (a7)+,a0
  751.         move.w    #$2700,sr
  752.  
  753.         movem.l    d0-a7,registres
  754.  
  755.         move.l    2(a7),d0        ;get PC
  756.         cmp.l    #start,d0
  757.         bcs.b    .notin
  758.         cmp.l    #end,d0
  759.         bcc.b    .notin
  760.         move.l    registres,d0
  761.         clr.b    entered
  762.         rte
  763. .notin
  764.  
  765.         tst.w    proc_type
  766.         bne.b    .go10plus
  767.         move.l    #simple_ret,$7c.w
  768.         bra.b    .go00
  769. .go10plus    movec    vbr,a0
  770.         move.l    #simple_ret,$7c(a0)
  771.  
  772. .go00
  773.         lea.l    stack,a7        ;Own stack
  774.                         ;now bsr are allowed
  775.  
  776.         bsr    ClearCache
  777.  
  778.         tst.b    config_lview
  779.         beq.b    .nolview
  780.         bsr    exec_here
  781.         bne.b    .nolview
  782.         move.l    gfxbase(pc),a6
  783.         move.l    34(a6),d0        ;get actual view
  784.         beq.b    .nolview
  785.         move.l    d0,wbview
  786.         sub.l    a1,a1
  787.         jsr    -222(a6)        ;LoadView(NULL)
  788.         move.l    signal_no(pc),d0
  789.         lea.l    tc_block(pc),a1
  790.         move.l    $4.w,a6
  791.         jsr    -324(a6)        ;Signal
  792. .nolview
  793.  
  794.         bsr    init_code
  795.  
  796.         bsr    ClearCache
  797.  
  798.         cmp.w    #4,proc_type
  799.         blt.b    .notrans0
  800.     MC68040
  801.         movec    itt0,d0
  802.         move.l    d0,itt0_reg
  803.         movec    itt1,d0
  804.         move.l    d0,itt1_reg
  805.         movec    dtt0,d0
  806.         move.l    d0,dtt0_reg
  807.         movec    dtt1,d0
  808.         move.l    d0,dtt1_reg
  809.         movec    tc,d0
  810.         move.l    d0,tc_reg
  811.         cpusha    bc
  812.         cinva    bc
  813.         dc.w $f518        ;pflusha
  814.     MC68030
  815. .notrans0
  816.  
  817.         lea.l    $dff000,a6
  818.         move.l    $4(a6),OldRaster    ;save raster pos
  819.                         ;(wrong coz of .waittrap !)
  820.  
  821. .blit        btst    #6,($2,a6)
  822.         bne.b    .blit            ;wait end of blitter operation
  823.  
  824.         move.l    a7_reg,a0
  825.         move.w    (a0),sr_reg
  826.         move.l    2(a0),pc_reg
  827.  
  828.         btst    #5,$bfe001        ;need to wait end of DMA disk ?
  829.         bne.b    .no_drive
  830.         move.l    #$20000,d1
  831. .loop        subq.l    #1,d1
  832.         beq.b    .no_drive
  833.         move.w    $1e(a6),d0        ;wait for DMAdisk IRQ
  834.         and.w    #2,d0
  835.         beq.b    .loop
  836. .no_drive
  837.         move.l    USP,a0
  838.         move.l    a0,usp_reg
  839.         move.l    a7_reg,ssp_reg
  840.         move.w    sr_reg,d0
  841.         and.w    #$2000,d0
  842.         bne.b    ok_ssp_a7
  843.         move.l    a0,a7_reg
  844. ok_ssp_a7
  845.         clr.l    vbr_reg
  846.         cmp.w    #1,proc_type
  847.         blt.b    .novbr
  848.         movec    VBR,d0
  849.         move.l    d0,vbr_reg
  850. .novbr
  851.         cmp.w    #2,proc_type
  852.         blt.w    .no23
  853.         movec    CACR,d0
  854.         move.l    d0,cacr_reg
  855.         moveq    #0,d0
  856.         cmp.w    #6,proc_type
  857.         bne.b    .no60
  858.         move.l    #'BUSR',CAAR_txt
  859.         dc.w    $4e7a,$0008        ;movec    BUSCR,d0
  860.         bra.b    .nocaar
  861. .no60        cmp.w    #4,proc_type
  862.         bge.b    .nocaar
  863.         movec    CAAR,d0
  864. .nocaar        move.l    d0,caar_reg
  865.         move.l    ssp_reg,isp_reg
  866.         move.l    ssp_reg,d0
  867.         cmp.w    #6,proc_type        ;68060 ?
  868.         beq.b    .nomsp
  869.         movec    MSP,d0
  870.         bra.b    .okmsp
  871. .nomsp        move.l    #'PCR=',MSP_txt
  872.         dc.w    $4e7a,$0808        ;movec    PCR,d0
  873. .okmsp        move.l    d0,msp_reg
  874.  
  875.         cmp.w    #4,proc_type
  876.         bge.b    .no23
  877.         or.w    #$2111,d0        ;switch all CACHE ON
  878.         movec    d0,CACR            ;(68020/68030 only)
  879. .no23
  880.  
  881.         bsr    enter_vbr
  882.  
  883.         bsr    save_custom
  884.  
  885.         bsr    save_CIA
  886.  
  887.         move.l    #-1,trace_address
  888.  
  889. ;-------------- don't trace subroutine in tracer ? --------
  890.  
  891.         tst.b    trace_bsr
  892.         beq.b    .no_bsr
  893.         tst.w    trace_count
  894.         beq.b    .oky
  895.         clr.w    trace_count
  896.         sf    trace_bsr
  897.         bra.b    .no_bsr
  898. .oky
  899.         move.w    sr_reg,d0
  900.  
  901.         move.l    a7_reg,a0
  902.         and.w    #$2000,d0
  903.         beq.b    .no_super
  904.         addq.l    #6,a0            ;skip SR and PC
  905.  
  906.         move.w    (a0),d0            ;read stack frame no
  907.         lsr.w    #4,d0
  908.         lsr.w    #8,d0
  909.         lea.l    frame(pc),a4
  910.         add.w    (a4,d0.w*2),a0        ;add stack frame size
  911. .no_super    move.l    (a0),tracer_old_rts
  912.         move.l    #.tracer_rts,(a0)
  913.         move.l    vbr_reg,a4
  914.         move.l    #.tracer_ill,$10(a4)
  915.         sf    trace_bsr
  916.         bra.b    .out
  917. .tracer_rts    illegal
  918. .tracer_ill    move.l    tracer_old_rts,2(a7)
  919.         bra.w    monitor
  920.  
  921. .no_bsr
  922. ;-------------------------------------------
  923.  
  924.         bsr    ClearCache
  925.  
  926.         bsr.w    super            ;enter main code
  927.  
  928. .out        move.w    #$7fff,d0
  929.         move.w    d0,$9a(a6)
  930.         move.w    d0,$96(a6)
  931.         move.w    d0,$9c(a6)
  932.  
  933.         bsr    restore_CIA
  934.         bsr    restore_custom
  935.  
  936.         bsr    init_mwatch
  937.  
  938.         cmp.w    #1,proc_type
  939.         ble.b    .okmsp2
  940.         cmp.w    #6,proc_type        ;68060 ?
  941.         beq.w    .nomsp2
  942.         move.l    msp_reg,a0
  943.     MC68030
  944.         movec    a0,MSP
  945.     MC68000
  946.         bra.b    .okmsp2
  947. .nomsp2        move.l    msp_reg,a0
  948.         dc.w    $4e7b,$8808        ;movec    a0,PCR
  949. .okmsp2
  950.         move.l    usp_reg,a0
  951.         move.l    a0,USP
  952.  
  953.         move.l    ssp_reg,a7
  954.         move.w    sr_reg,(a7)
  955.  
  956.         move.l    vbr_reg,a4
  957.  
  958.         tst.w    trace_count
  959.         beq.b    trace_off
  960.         or.w    #$8000,(a7)
  961.         move.l    $24(a4),old_trace
  962.         lea.l    trace_reach(pc),a0
  963.         move.l    a0,$24(a4)
  964.  
  965. trace_off    cmp.l    #-1,trace_address
  966.         beq.b    tracea_off
  967.         or.w    #$8000,(a7)
  968.         move.l    $24(a4),old_trace
  969.         lea.l    tracea_reach(pc),a0
  970.         move.l    a0,$24(a4)
  971. tracea_off
  972.         move.l    pc_reg,2(a7)
  973.  
  974.         bsr    ClearCache
  975.         cmp.w    #6,proc_type
  976.         bne.b    .no60
  977.         move.l    caar_reg,a0
  978.         dc.w    $4e7b,$8008        ;movec a0,BUSCR
  979. .no60        cmp.w    #1,proc_type
  980.         ble.b    .nocache
  981.         cmp.w    #4,proc_type
  982.         bge.b    .nocaar2
  983.     MC68030
  984.         move.l    caar_reg,a0
  985.         movec    a0,CAAR
  986. .nocaar2    move.l    cacr_reg,d0
  987.         movec    d0,CACR            ;restore CACR
  988.     MC68000
  989. .nocache
  990.         cmp.w    #4,proc_type
  991.         blt.b    .notrans
  992.     MC68040
  993.         move.l    itt0_reg,d0
  994.         movec    d0,itt0
  995.         move.l    itt1_reg,d0
  996.         movec    d0,itt1
  997.         move.l    dtt0_reg,d0
  998.         movec    d0,dtt0
  999.         move.l    dtt1_reg,d0
  1000.         movec    d0,dtt1
  1001.         cpusha    bc
  1002.         cinva    bc
  1003.         dc.w $f518        ;pflusha
  1004.     MC68000
  1005. .notrans
  1006.  
  1007.         move.l    custom+$4,d0
  1008.         lsr.l    #1,d0
  1009.         lsr.w    #7,d0
  1010. .raster        move.l    $4(a6),d1        ;wait raster pos
  1011.         lsr.l    #1,d1            ;for exit
  1012.         lsr.w    #7,d1
  1013.         cmp.w    d0,d1
  1014. ;        bne.b    .raster
  1015.  
  1016.         tst.b    reboot
  1017.         beq.b    .noreboot
  1018.         sf    reboot
  1019.         lea.l    $48000,a0
  1020.         lea.l    start,a1
  1021.         move.l    #(end-start),d0
  1022.         lsr.l    #3,d0
  1023. .copy        move.l    (a1)+,(a0)+        ;copy HRTmon to $48000
  1024.         move.l    (a1)+,(a0)+
  1025.         dbf    d0,.copy
  1026.  
  1027. .noreboot
  1028.         tst.b    kill
  1029.         beq.b    .nokill
  1030.     MC68030
  1031.         tst.w    proc_type
  1032.         beq.b    .okkill
  1033.         move.l    old_vbr(pc),a0
  1034.         movec    a0,VBR
  1035.     MC68000
  1036.         bra.b    .okkill
  1037.  
  1038. .nokill
  1039.         bsr    exit_vbr
  1040.  
  1041. .okkill        movem.l    registres,d0-d7/a0-a6
  1042.         sf    entered
  1043.  
  1044. simple_ret    rte
  1045.  
  1046.  
  1047. *************************************************************
  1048.  
  1049. clean_vbr    movem.l    d0/a0-a1/a4,-(a7)
  1050.  
  1051. ;remove all HRTmon ptr in vector table
  1052.         move.l    vbr_reg,a4
  1053.         lea.l    backup_vbr,a0
  1054.         move.w    #$400/4-1,d0
  1055. .loop        move.l    (a4),a1
  1056.         cmp.l    #start,a1    ;check if vector points in HRTmon
  1057.         bcs.b    .norestore
  1058.         cmp.l    #end,a1
  1059.         bcc.b    .norestore
  1060.         move.l    (a0),(a4)
  1061. .norestore    addq.l    #4,a0
  1062.         addq.l    #4,a4
  1063.         dbf    d0,.loop
  1064.  
  1065. ;update vector table backup
  1066.         lea.l    backup_vbr,a1
  1067.         move.l    vbr_reg,a0
  1068.         move.w    #$400/4-1,d0
  1069. .copy        move.l    (a0)+,(a1)+
  1070.         dbf    d0,.copy
  1071.  
  1072.         movem.l    (a7)+,d0/a0-a1/a4
  1073.         rts
  1074.  
  1075. *************************************************************
  1076.  
  1077. enter_vbr    movem.l    d0-a6,-(a7)
  1078.  
  1079.         bsr    clean_vbr
  1080.  
  1081.         tst.w    proc_type
  1082.         bne.b    .no68000
  1083.  
  1084. ;        move.l    #newirq,$6c.w
  1085.  
  1086.         bra.b    .ok68000
  1087.  
  1088. .no68000    lea.l    HRTmon_vbr(pc),a0
  1089.     MC68030
  1090.         movec    a0,vbr
  1091.     MC68000
  1092.  
  1093. .ok68000    movem.l    (a7)+,d0-a6
  1094.         rts
  1095.  
  1096. *************************************************************
  1097.  
  1098. exit_vbr    tst.w    proc_type
  1099.         bne.b    .no68000
  1100.  
  1101. ;        move.l    backup_vbr+$6c,$6c.w
  1102.  
  1103.         lea.l    $60.w,a0
  1104.         lea.l    except_entry0(pc),a1
  1105.         moveq    #7-1,d0
  1106. .loop0        move.l    a1,(a0)+
  1107.         addq.l    #4,a1
  1108.         dbf    d0,.loop0
  1109.  
  1110.         bra.b    .ok68000
  1111.  
  1112. .no68000    move.l    vbr_reg,a0
  1113.     MC68030
  1114.         movec    a0,vbr
  1115.     MC68000
  1116.  
  1117.         tst.b    config_RM
  1118.         bne.b    .okRM
  1119.         tst.b    config_key
  1120.         beq.b    .ok68000
  1121. .okRM
  1122.         lea.l    $60(a0),a0
  1123.         lea.l    except_entry(pc),a1
  1124.         moveq    #7-1,d0
  1125. .loop        move.l    a1,(a0)+
  1126.         dbf    d0,.loop
  1127.  
  1128. .ok68000    move.l    vbr_reg,a0
  1129.         move.l    #monitor,$7c(a0)
  1130.         rts
  1131.  
  1132. *************************************************************
  1133.  
  1134. ;Clear instruction and data cache of 68000-68060
  1135.  
  1136. ClearCache    move.l    d0,-(a7)
  1137.         cmp.w    #1,proc_type    ;no flush for 68000 and 68010
  1138.         bls.b    .end
  1139.         cmp.w    #4,proc_type
  1140.         bge.b    .cic_040
  1141.  
  1142.     MC68030
  1143.         movec    CACR,d0
  1144.         cmp.w    #3,proc_type
  1145.         bne.b    .no30
  1146.         or.w    #$0800,d0
  1147. .no30        or.w    #$8,d0
  1148.         movec    d0,CACR
  1149.         bra.b    .end
  1150.     MC68000
  1151. .cic_040
  1152.     MC68040
  1153.         cpusha    BC
  1154.         cinva    BC
  1155.     MC68000
  1156. .end
  1157.         move.l    (a7)+,d0
  1158.         rts
  1159.  
  1160. ***********************************************************
  1161. ;test if 68020,30,40,or 60 processor
  1162.  
  1163. ;<- d0=processor type 2=68020,3=68030,4=68040,6=68060
  1164.  
  1165.     MC68030
  1166.  
  1167. test_CPU    move.w    #$2700,sr
  1168.         movem.l    d1-d2/a0/a4,-(a7)
  1169.         move.l    $10.w,d1
  1170.         move.l    #.mc00,$10.w
  1171.         movec    VBR,a0        ;68000 ?
  1172.         move.l    d1,$10.w
  1173.         move.l    a0,.old_vbr
  1174.  
  1175.         lea.l    .except,a0
  1176.         movec    a0,VBR
  1177.  
  1178.         move.l    a7,a4
  1179.  
  1180.         moveq    #1,d0
  1181.         move.b    (.dat020,pc,d0.w*2),d0    ;68010 ?
  1182.         cmp.b    #1,d0
  1183.         beq.b    .out
  1184.  
  1185.         moveq    #1,d0
  1186.         moveq    #1,d1
  1187.         moveq    #1,d2
  1188.         move.l    #.mc60,($f4,a0)    ;new unimplemented instr.
  1189.         muls.l    d0,d1:d2    ;68060 ? (not implemented on 060)
  1190.  
  1191.     MC68040
  1192.         move.l    #.mc23,($10,a0)    ;new illegal
  1193.         movec    URP,d0        ;68040 and 68060 only
  1194.     MC68030
  1195.  
  1196.         moveq    #4,d0
  1197.         bra.b    .out
  1198.  
  1199. .ret23        move.l    #.mc20,($2c,a0)    ;new F-line
  1200.         pflusha            ;030 MMU instruction
  1201.  
  1202.         moveq    #3,d0
  1203.  
  1204. .out        move.l    a4,a7
  1205.         move.l    .old_vbr,a0
  1206.         movec    a0,VBR
  1207. .out00        movem.l    (a7)+,d1-d2/a0/a4
  1208.         move.w    #$2700,sr
  1209.         rts
  1210.  
  1211. .dat020        dc.b 0,1,2,3
  1212.  
  1213. .mc00        moveq    #0,d0
  1214.         move.l    d1,$10.w
  1215.         move.l    #.out00,(2,a7)
  1216.         rte
  1217.  
  1218. .mc60        moveq    #6,d0
  1219.         move.l    #.out,(2,a7)
  1220.         rte
  1221.  
  1222. .mc23        move.l    #.ret23,(2,a7)
  1223.         rte
  1224.  
  1225. .mc20        moveq    #2,d0
  1226.         move.l    #.out,(2,a7)
  1227.         rte
  1228.  
  1229.     MC68000
  1230.  
  1231. .old_vbr    dc.l 0
  1232. .kill        rte
  1233.         cnop 0,4
  1234. .except        dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1235.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1236.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1237.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1238.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1239.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1240.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1241.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1242.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1243.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1244.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1245.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1246.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1247.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1248.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1249.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1250.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1251.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1252.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1253.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1254.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1255.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1256.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1257.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1258.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1259.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1260.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1261.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1262.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1263.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1264.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1265.         dc.l .kill,.kill,.kill,.kill,.kill,.kill,.kill,.kill
  1266.  
  1267. ***********************************************************
  1268. ;-------------- save custom registers ---------------------
  1269. ;-------------- palette saving done by read_palette -------
  1270.  
  1271. save_custom    movem.l    d0/a0-a4,-(a7)
  1272.  
  1273. ;        lea.l    Action_CUST,a0
  1274.         lea.l    custom,a1
  1275.         move.l    a1,a4
  1276. ;        move.w    #$200/8-1,d0
  1277. ;.copy        move.l    (a0)+,(a1)+
  1278. ;        move.l    (a0)+,(a1)+
  1279. ;        dbf    d0,.copy
  1280.  
  1281.         move.w    $2(a6),d0
  1282.         move.w    d0,2(a4)
  1283.         or.w    #$8000,d0
  1284.         move.w    d0,$96(a4)    ;DMACON
  1285.         move.w    #$7fff,$96(a6)
  1286.         move.w    $1c(a6),d0
  1287.         move.w    d0,$1c(a4)
  1288.         or.w    #$8000,d0
  1289.         move.w    d0,$9a(a4)    ;INTENA
  1290.         move.w    #$7fff,$9a(a6)
  1291.         move.w    $1e(a6),d0
  1292.         move.w    d0,$1e(a4)
  1293.         or.w    #$8000,d0
  1294.         move.w    d0,$9c(a4)    ;INTREQ
  1295.         move.w    #$7fff,$9c(a6)
  1296.  
  1297.         move.w    $10(a6),d0
  1298.         move.w    d0,$10(a4)
  1299.         or.w    #$8000,d0
  1300.         move.w    d0,$9e(a4)    ;ADKCON
  1301.  
  1302.         move.l    OldRaster,$4(a4)    ;VPOSR,VHPOSR
  1303.  
  1304.         lea.l    $a(a6),a0
  1305.         lea.l    $a(a4),a1
  1306.         moveq    #9-1,d0
  1307. .copy1        move.w    (a0)+,(a1)+
  1308.         dbf    d0,.copy1
  1309.  
  1310.         move.w    $7c(a6),$7c(a4)        ;LISAID
  1311.         move.w    $1da(a6),$1da(a4)    ;HHPOSR
  1312.  
  1313.     ;    moveq    #0,d0
  1314.     ;    jsr    analyse_copper
  1315.  
  1316.         movem.l    (a7)+,d0/a0-a4
  1317.         rts
  1318.  
  1319. ;-------------- restore custom registers ------------------
  1320.  
  1321. restore_custom    movem.l    d0/a1,-(a7)
  1322.         lea.l    custom,a1
  1323.  
  1324.         ;move.l    $20(a1),$20(a6)        ;DISKPTR
  1325.         move.w    $7e(a1),$7e(a6)        ;DSKSYNC
  1326.         move.w    $9e(a1),$9e(a6)        ;ADKCON
  1327.         ;move.w    $34(a1),$34(a6)        ;POTGO
  1328.         move.w    $1dc(a1),$1dc(a6)    ;BEAMCON0
  1329.         ;move.w    $1e4(a1),$1e4(a6)    ;DIWHIGH
  1330.         move.l    $8e(a1),$8e(a6)        ;diwstrt/stop
  1331.         move.l    $92(a1),$92(a6)        ;ddfstrt/stop
  1332.         ;move.l    $e0(a1),$e0(a6)        ;BPL1PT
  1333.         move.w    $1fc(a1),$1fc(a6)    ;FMODE
  1334.         move.l    $108(a1),$108(a6)    ;BPL1MOD
  1335.         move.w    $106(a1),$106(a6)    ;BPLCON3
  1336.         move.l    $100(a1),$100(a6)    ;BPLCON0
  1337.         ;move.w    $10c(a1),$10c(a6)    ;BPLCON4
  1338.  
  1339.         move.w    $96(a1),$96(a6)        ;DMACON
  1340.         move.w    $9c(a1),$9c(a6)        ;INTREQ
  1341.         move.w    $9a(a1),$9a(a6)        ;INTENA
  1342.  
  1343. ;        move.l    $84(a1),d0        ;correct
  1344. ;        cmp.l    #$f28,d0        ;an AmigaOS
  1345. ;        bne.b    .nof28            ;problem
  1346. ;        tst.l    $f28.w            ;of the LoadView(NULL)
  1347. ;        bne.b    .nof28
  1348. ;        move.l    #$f24,$84(a1)
  1349. ;        move.l    #$f24,$84(a6)
  1350. ;.nof28
  1351.         movem.l    (a7)+,d0/a1
  1352.         rts
  1353.  
  1354. save_CIA    movem.l    a0-a1,-(a7)
  1355.  
  1356. ;        lea.l    Action_CIAA,a0
  1357. ;        lea.l    CIAA,a1
  1358. ;        move.b    $1(a0),(a1)+
  1359. ;        move.b    $101(a0),(a1)+
  1360. ;        move.b    $201(a0),(a1)+
  1361. ;        move.b    $301(a0),(a1)+
  1362. ;        move.b    $401(a0),(a1)+
  1363. ;        move.b    $501(a0),(a1)+
  1364. ;        move.b    $601(a0),(a1)+
  1365. ;        move.b    $701(a0),(a1)+
  1366. ;        move.b    $801(a0),(a1)+
  1367. ;        move.b    $901(a0),(a1)+
  1368. ;        move.b    $a01(a0),(a1)+
  1369. ;        move.b    $b01(a0),(a1)+
  1370. ;        move.b    $c01(a0),(a1)+
  1371. ;        move.b    $d01(a0),(a1)+
  1372. ;        move.b    $e01(a0),(a1)+
  1373. ;        move.b    $f01(a0),(a1)+
  1374. ;
  1375. ;        lea.l    Action_CIAB,a0
  1376. ;        lea.l    CIAB,a1
  1377. ;        move.b    (a0),(a1)+
  1378. ;        move.b    $100(a0),(a1)+
  1379. ;        move.b    $200(a0),(a1)+
  1380. ;        move.b    $300(a0),(a1)+
  1381. ;        move.b    $400(a0),(a1)+
  1382. ;        move.b    $500(a0),(a1)+
  1383. ;        move.b    $600(a0),(a1)+
  1384. ;        move.b    $700(a0),(a1)+
  1385. ;        move.b    $800(a0),(a1)+
  1386. ;        move.b    $900(a0),(a1)+
  1387. ;        move.b    $a00(a0),(a1)+
  1388. ;        move.b    $b00(a0),(a1)+
  1389. ;        move.b    $c00(a0),(a1)+
  1390. ;        move.b    $d00(a0),(a1)+
  1391. ;        move.b    $e00(a0),(a1)+
  1392. ;        move.b    $f00(a0),(a1)+
  1393.  
  1394.         move.b    #$c0,$bfd200        ;reinit CIAs
  1395.         move.b    #$ff,$bfd300        ;for
  1396.         move.b    #$03,$bfe201        ;AR
  1397. ;        move.b    #$7f,$bfec01
  1398.         move.b    #$00,$bfee01
  1399.         move.b    #$88,$bfed01
  1400.         move.b    #$ff,$bfd100
  1401.         sf    mot_on
  1402.  
  1403.         move.w #$0f00,$34(a6)        ;reinit right-mouse button
  1404.  
  1405.         movem.l    (a7)+,a0-a1
  1406.         rts
  1407.  
  1408. restore_CIA    movem.l    a0-a1,-(a7)
  1409.  
  1410. ;        lea.l    $bfe000,a0
  1411. ;        lea.l    CIAA,a1
  1412. ;        clr.b    $e01(a0)
  1413. ;        clr.b    $f01(a0)
  1414. ;        move.b    (a1),$1(a0)
  1415. ;        move.b    1(a1),$101(a0)
  1416. ;        move.b    2(a1),$201(a0)
  1417. ;        move.b    3(a1),$301(a0)
  1418. ;        move.b    4(a1),$401(a0)
  1419. ;        move.b    5(a1),$501(a0)
  1420. ;        move.b    6(a1),$601(a0)
  1421. ;        move.b    7(a1),$701(a0)
  1422. ;        move.b    8(a1),$801(a0)
  1423. ;        move.b    9(a1),$901(a0)
  1424. ;        move.b    10(a1),$a01(a0)
  1425. ;        move.b    11(a1),$b01(a0)
  1426. ;        move.b    12(a1),$c01(a0)
  1427. ;        move.b    14(a1),$e01(a0)
  1428. ;        move.b    15(a1),$f01(a0)
  1429. ;        move.b    13(a1),$d01(a0)
  1430. ;
  1431. ;        lea.l    $bfd000,a0
  1432. ;        lea.l    CIAB,a1
  1433. ;        clr.b    $e00(a0)
  1434. ;        clr.b    $f00(a0)
  1435. ;        move.b    (a1),(a0)
  1436. ;        move.b    1(a1),$100(a0)
  1437. ;        move.b    2(a1),$200(a0)
  1438. ;        move.b    3(a1),$300(a0)
  1439. ;        move.b    4(a1),$400(a0)
  1440. ;        move.b    5(a1),$500(a0)
  1441. ;        move.b    6(a1),$600(a0)
  1442. ;        move.b    7(a1),$700(a0)
  1443. ;        move.b    8(a1),$800(a0)
  1444. ;        move.b    9(a1),$900(a0)
  1445. ;        move.b    10(a1),$a00(a0)
  1446. ;        move.b    11(a1),$b00(a0)
  1447. ;        move.b    12(a1),$c00(a0)
  1448. ;        move.b    14(a1),$e00(a0)
  1449. ;        move.b    15(a1),$f00(a0)
  1450. ;        move.b    13(a1),$d00(a0)
  1451.  
  1452.         movem.l    (a7)+,a0-a1
  1453.         rts
  1454.  
  1455. ***********************************************************
  1456. ; update status line (at bottom of screen)
  1457.  
  1458. print_status:    movem.l    d0-d3/a0,-(a7)
  1459.         lea.l    insert_off_txt,a0
  1460.         tst.b    insert_mode
  1461.         beq.b    .ok_ins_off
  1462.         lea.l    insert_on_txt,a0
  1463. .ok_ins_off    moveq    #76,d0
  1464.         move.w    screen_height,d1
  1465.         subq.w    #1,d1
  1466.         moveq    #3-1,d3
  1467. .loop        move.b    (a0)+,d2
  1468.         bsr    print_char2
  1469.         addq.w    #1,d0
  1470.         dbf    d3,.loop
  1471.  
  1472.         lea.l    start(pc),a0
  1473.         move.l    a0,d0
  1474.         lea.l    watch_txt,a0
  1475.         moveq    #8,d1
  1476.         bsr    conv_hex
  1477.         move.w    screen_height,d1
  1478.         subq.w    #1,d1
  1479.         moveq    #47,d0
  1480.         moveq    #8-1,d3
  1481. .loop2        move.b    (a0)+,d2
  1482.         bsr    print_char2
  1483.         addq.w    #1,d0
  1484.         dbf    d3,.loop2
  1485.  
  1486.         movem.l    (a7)+,d0-d3/a0
  1487.         rts
  1488.  
  1489. ***********************************************************
  1490.  
  1491. super        move.w    #$2000,sr        ;enable interrupts
  1492.  
  1493.         cmp.b    #1,config_screen
  1494.         bne.b    .nontsc
  1495.         move.w    #0,$1dc(a6)        ;NTSC mode 15Khz
  1496.         bra.b    .okscreen
  1497. .nontsc        move.w    #$20,$1dc(a6)        ;PAL mode 15Khz
  1498. .okscreen
  1499.         jsr    read_palette
  1500.  
  1501.         bsr    clear_break
  1502.  
  1503.         move.l    vbr_reg,a4
  1504.         move.l    illegal_except,d0    ;restore vector used
  1505.         beq.b    no_illegal_init        ;by breakpoint
  1506.         move.l    d0,$10(a4)
  1507. no_illegal_init
  1508.  
  1509.         bsr    set_pic        ;init display area
  1510.  
  1511.         moveq    #0,d0
  1512.         lea.l    $140(a6),a0
  1513.         moveq    #$16-1,d1
  1514. clr_spr        move.l    d0,(a0)+        ;clear sprites data
  1515.         dbf    d1,clr_spr
  1516.  
  1517.         bsr    print_page
  1518.  
  1519.         tst.b    trace_moni        ;in tracer ?
  1520.         bne.b    no_print_trace
  1521.  
  1522.         bsr    check_debug        ;print debug entry message
  1523.  
  1524.         tst.b    BP_reach        ;entered from BreakPoint ?
  1525.         beq.b    no_BP_enter
  1526.         move.l    Break_Address,d0
  1527.         moveq    #8,d1
  1528.         lea.l    BP_enter_txt,a0
  1529.         bsr    print_curs
  1530.         bsr    print_hexCR
  1531. no_BP_enter
  1532.         tst.b    BPJ_reach        ;entered from JSR BP ?
  1533.         beq.b    no_BPJ_enter
  1534.         move.l    Break_Address,d0
  1535.         moveq    #8,d1
  1536.         lea.l    BPJ_enter_txt,a0
  1537.         bsr    print_curs
  1538.         bsr    print_hexCR
  1539. no_BPJ_enter
  1540.         bsr    clear_cursor
  1541.         clr.w    cursor_x
  1542.  
  1543.         bsr    ShowWatchEntry
  1544.  
  1545.         move.l    ssp_reg,a0        ;stackframe
  1546.         jsr    _ShowEntryReason
  1547.         bsr    print_reg        ;print CPU registers
  1548.         move.l    pc_reg,dis_ptr
  1549.         bsr    single_inst        ;disassemble 1 instr. at PC
  1550.  
  1551. no_print_trace
  1552.         sf    escape
  1553.  
  1554.         tst.b    BPatPC
  1555.         beq.b    .noPC
  1556.         st    escape
  1557. .noPC
  1558.         sf    p_used            ;clr signal to allow sp command
  1559.         bsr    force_change        ;force floppy disk change
  1560.  
  1561. ;.joy        move.w    #0,$dff106
  1562. ;        move.w    #$f,$dff180
  1563. ;        btst    #7,$bfe001
  1564. ;        bne.b    .joy
  1565.  
  1566. .raster        move.l    $4(a6),d0
  1567.         lsr.l    #1,d0
  1568.         lsr.w    #7,d0
  1569.         cmp.w    #$f0,d0
  1570.         blt.b    .raster
  1571.  
  1572.         move.b    #$7f,key_prev
  1573.  
  1574.         tst.b    config_IDE
  1575.         beq.b    .noIDEirq
  1576.         move.l    ide_irq,d0
  1577.         beq.b    .noIDEirq
  1578.         move.l    d0,a3
  1579.         tst.b    (a3)
  1580.         bpl.b    .noIDEirq
  1581.         move.l    ide_base,a3
  1582.         jsr    wait_irq        ;remove IRQ request from IDE
  1583. .noIDEirq
  1584.         bsr    print_status
  1585.  
  1586.         moveq    #0,d2
  1587.         move.b    config_delay,d2
  1588.         move.w    d2,time_repeat
  1589.  
  1590.         move.w    #$7fff,$9c(a6)        ;disable all INTREQ
  1591.         move.w    #$8300,$96(a6)        ;bitplan DMA on
  1592.         move.w    #$c020,$9a(a6)        ;VBL+CIAA IRQ on
  1593.  
  1594.         moveq    #3-1,d0
  1595. .loopk        sf    VBL
  1596. .waitk        tst.b    VBL            ;wait to flush keyboard
  1597.         beq.b    .waitk            ;buffer
  1598.         dbf    d0,.loopk
  1599.  
  1600.         clr.w    nb_keys
  1601.  
  1602. ;-------------- Main Loop ---------------------------------
  1603.  
  1604. wait        tst.w    nb_keys
  1605.         bne.b    .go_fast
  1606.         stop    #$2000
  1607.  
  1608. .go_fast
  1609.  
  1610. ;-------------- handle repeat key --------------------
  1611.  
  1612.         move.w    #$2700,sr
  1613.         move.b    key_prev,d0
  1614.         move.w    nb_keys,d1        ;key in buffer ?
  1615.         beq.b    .no_key
  1616.         subq.w    #1,nb_keys
  1617.         subq.w    #1,d1
  1618.         lea.l    key_buffer,a0
  1619.         move.b    (a0),d0
  1620. .copy        move.b    1(a0),(a0)+        ;remove one key from buffer
  1621.         dbf    d1,.copy
  1622. .no_key        move.w    #$2000,sr
  1623.  
  1624.         move.b    d0,d1
  1625.         cmp.b    key_prev,d0
  1626.         beq.b    same_key
  1627.         moveq    #0,d2
  1628.         move.b    config_delay,d2
  1629.         move.w    d2,time_repeat
  1630.         bra.b    ok_same_key
  1631. same_key
  1632.         tst.w    time_repeat
  1633.         bmi.w    ok_same_key
  1634.         move.b    #$7f,d0
  1635.  
  1636. ok_same_key    move.b    d1,key_prev
  1637.         move.b    d0,key
  1638.  
  1639. ;-------------- main stuff ---------------------------
  1640.  
  1641.         bsr    special_keys
  1642.  
  1643.         tst.b    trace_moni    ;tracer on ?
  1644.         beq.b    .go_key
  1645.         bsr.w    do_tracer
  1646.         bra.b    .no_key
  1647.  
  1648. .go_key        bsr    normal_keys
  1649.  
  1650. .no_key        tst.b    escape        ;quit HRTmon ?
  1651.         beq.w    wait
  1652.  
  1653. ;-------------- exit ---------------------------------
  1654.  
  1655. out_mon        st    tracer_refresh
  1656.         move.w    #$2700,sr
  1657.         move.w    #$7fff,$9a(a6)
  1658.         move.w    #$7fff,$96(a6)
  1659.         move.w    #$7fff,$9c(a6)
  1660.  
  1661.         tst.b    trace_moni
  1662.         bne.b    .noclr
  1663.         bsr    clear_cursor
  1664. .noclr
  1665.         bsr    remove_pic
  1666.  
  1667.         jsr    restore_palette
  1668.  
  1669.         bsr    init_break        ;set breakpoints
  1670.  
  1671.         move.w    drive,-(a7)
  1672.         moveq    #3,d4            ;first drive SEL (drive0)
  1673.         lea.l    drive_present,a3
  1674.         moveq    #4-1,d5            ;4 drives
  1675. .loopd        tst.b    (a3)+
  1676.         beq.b    .nodrive
  1677.         move.w    d4,drive        ;restore
  1678.         bsr    rest_head        ;floppy drive head pos
  1679. .nodrive    addq.w    #1,d4
  1680.         dbf    d5,.loopd
  1681.         move.w    (a7)+,drive
  1682.  
  1683.         rts
  1684.  
  1685. *******************************************************
  1686. ;------------------------------------------------
  1687. ;-------------- get a key from keyboard ---------
  1688. ;-------------- used for confirmation y/n -------
  1689.  
  1690. ;<- d0=key (ascII)
  1691.  
  1692. get_key        clr.w    nb_keys
  1693. .wait        tst.w    nb_keys
  1694.         beq.b    .wait
  1695.         tst.b    key_buffer    ;key released ?
  1696.         bmi.b    get_key
  1697.         move.w    #$2700,sr
  1698.         clr.w    nb_keys
  1699.         moveq    #0,d0
  1700.         move.b    key_buffer,d0
  1701.         move.b    #$7f,key_prev
  1702.         move.w    #$2000,sr
  1703.         move.l    a0,-(a7)
  1704.         move.l    board_ptr,a0
  1705.         move.b    (a0,d0.w),d0
  1706.         move.l    (a7)+,a0
  1707.         rts
  1708.  
  1709. *******************************************************
  1710. ;-------------- Tracer --------------------------------
  1711.  
  1712. do_tracer    movem.l    d0-d7/a0-a6,-(a7)
  1713.  
  1714.         tst.b    tracer_refresh
  1715.         beq.w    .no_ref
  1716.         sf    tracer_refresh
  1717.         clr.l    cursor_x
  1718.         bsr    print_reg
  1719.  
  1720.         lea.l    empty_txt,a0
  1721.         bsr    print
  1722.  
  1723.         lea.l    tracer_addr,a3
  1724.         move.l    pc_reg,a4
  1725.  
  1726.         moveq    #5,d6            ;no of actual line
  1727.         move.w    screen_height,d0
  1728.         sub.w    #11,d0
  1729. .seek        cmp.l    (a3)+,a4
  1730.         beq.b    .found
  1731.         addq.l    #1,d6
  1732.         dbf    d0,.seek
  1733.  
  1734.         moveq    #5,d6
  1735.         lea.l    tracer_addr,a3
  1736.  
  1737.         move.w    screen_height,d7
  1738.         sub.w    #11,d7
  1739. .loop        move.l    a4,(a3)+
  1740.         move.l    a4,-(a7)
  1741.         bsr    reloc_pic
  1742.         lea.l    general_txt,a0
  1743.         moveq    #7,d0        ;upper case, d $address,indir. address
  1744.         jsr    disassemble
  1745.         move.l    (a7)+,a4
  1746.         add.w    d0,a4
  1747.         lea.l    general_txt,a0
  1748.         bsr    print
  1749.         dbf    d7,.loop
  1750.  
  1751. .found
  1752.     movem.w    d0-d1,-(a7)
  1753.     movem.w    actual_pos,d0-d1
  1754.     tst.w    d0
  1755.     bmi.b    .no
  1756.     move.b    #' ',d2
  1757.     bsr    print_char        ;clear old '>'
  1758. .no    movem.w    (a7)+,d0-d1
  1759.  
  1760.         moveq    #11,d0
  1761.         move.l    d6,d1
  1762.         movem.w    d0-d1,actual_pos
  1763.         move.b    #'>',d2
  1764.         bsr    print_char
  1765.  
  1766. .no_ref
  1767.         lea.l    key,a0
  1768.         cmp.b    #$7f,d0
  1769.         beq.w    .nok
  1770.         cmp.b    #$4e,d0
  1771.         bne.b    .nor
  1772.         move.b    #$7f,(a0)
  1773.         move.w    #1,trace_count
  1774.         st    escape
  1775.         st    tracer_refresh
  1776. .nor        cmp.b    #$4d,d0
  1777.         bne.b    .nodown
  1778.         move.b    #$7f,(a0)
  1779.         movem.w    actual_pos,d0-d1
  1780.         move.l    ascII_ptr,a1
  1781.         mulu    #80,d1
  1782.         add.l    d1,a1
  1783.         cmp.b    #'J',1(a1,d0.w)
  1784.         bne.b    .no_jsr
  1785.         cmp.b    #'S',2(a1,d0.w)
  1786.         bne.b    .no_jsr
  1787.         cmp.b    #'R',3(a1,d0.w)
  1788.         beq.b    .go_bsr
  1789.  
  1790. .no_jsr
  1791.         cmp.b    #'B',1(a1,d0.w)
  1792.         bne.b    .no_bsr
  1793.         cmp.b    #'S',2(a1,d0.w)
  1794.         bne.b    .no_bsr
  1795.         cmp.b    #'R',3(a1,d0.w)
  1796.         bne.b    .no_bsr
  1797.  
  1798. .go_bsr        st    trace_bsr
  1799. .no_bsr        move.w    #1,trace_count
  1800.         st    escape
  1801.         st    tracer_refresh
  1802.  
  1803. .nodown
  1804. .nok
  1805.         movem.l    (a7)+,d0-d7/a0-a6
  1806.         rts
  1807.  
  1808. empty_txt    dcb.b 79," "
  1809.         dc.b $a,0
  1810.         even
  1811.  
  1812. *******************************************************
  1813. ;-------------- restore pic-mem area used by display --
  1814.  
  1815. remove_pic    tst.b    pic_status
  1816.         beq.b    .okpic
  1817.         sf    pic_status
  1818.         move.w    #$2700,sr
  1819.         st    no_print
  1820.  
  1821.         tst.w    proc_type
  1822.         bne.b    .no68000
  1823.         move.l    backup_vbr+$6c,$6c.w
  1824. .no68000
  1825.         movem.l    d0/a0-a1,-(a7)
  1826.         moveq    #0,d0
  1827.         move.w    d0,$dff106
  1828.         move.l    d0,$dff180
  1829.         move.l    pic_ptr,a0
  1830.         lea.l    backup_pic,a1
  1831.         move.w    #PICSIZE/4-1,d0
  1832. .copy        move.l    (a1)+,(a0)+
  1833.         dbf    d0,.copy
  1834.         movem.l    (a7)+,d0/a0-a1
  1835. .okpic        rts
  1836.  
  1837. ;-------------- save pic-mem area and print pic -------
  1838.  
  1839. set_pic        tst.b    pic_status
  1840.         bne.b    .okpic
  1841.         st    pic_status
  1842.  
  1843.         tst.w    proc_type
  1844.         bne.b    .no68000
  1845.         move.l    #newirq,$6c.w
  1846. .no68000
  1847.  
  1848.         movem.l    d0/a0-a1,-(a7)
  1849.         move.l    pic_ptr,a0
  1850.         lea.l    backup_pic,a1
  1851.         move.w    #PICSIZE/4-1,d0
  1852. .copy        move.l    (a0)+,(a1)+
  1853.         dbf    d0,.copy
  1854.         movem.l    (a7)+,d0/a0-a1
  1855.         sf    no_print
  1856.         bsr    print_page
  1857.         move.w    #$2000,sr
  1858. .okpic        rts
  1859.  
  1860. ***********************************************************
  1861. ;-------------- jmp here when a keyboard reset-warn code --
  1862. ;-------------- has been received -------------------------
  1863.  
  1864. go_reset    move.w    #$2700,sr
  1865.         clr.l    inited
  1866.         sf    entered
  1867.         move.l    $f80004,a0
  1868.         subq.l    #2,a0
  1869.         move.w    #0,$dff100
  1870.         move.w    #0,$dff1dc
  1871.         jmp    (a0)
  1872.  
  1873. ***********************************************************
  1874. ;-------------- VBL interrupt handler ---------------------
  1875.  
  1876. newirq        movem.l    d0-d7/a0-a6,-(a7)
  1877.         lea.l    $dff000,a6
  1878.  
  1879.         st    VBL        ;signal a VBL
  1880.  
  1881. ;-------------- init display registers ----------
  1882.         move.l    pic_ptr(pc),d0
  1883.  
  1884.         cmp.b    #1,config_screen
  1885.         bne.b    .nontsc
  1886.  
  1887.         move.l    #$90010000,$100(a6)
  1888.         move.l    #$3081f7c1,$8e(a6)
  1889.         move.w    #$0,$1dc(a6)
  1890.  
  1891.         move.l    d0,$e0(a6)
  1892.         move.w    #$0c00,$106(a6)
  1893.         move.w    #$0000,$10c(a6)
  1894.         move.w    color0,$180(a6)
  1895.         move.w    color1,$182(a6)
  1896.         move.l    #$003c00d4,$92(a6)
  1897.         move.w    #0,$108(a6)
  1898.  
  1899.         move.w    #0,$1fc(a6)
  1900.  
  1901.         bra.w    .okmode
  1902.  
  1903.  
  1904. .nontsc        cmp.b    #2,config_screen
  1905.         bne.w    .nomulti
  1906.  
  1907.         move.l    d0,$e0(a6)
  1908.  
  1909.         move.l    #$2c4500e5,$8e(a6)
  1910.         move.l    #$00200068,$92(a6)
  1911.         move.w    #$1b88,$1dc(a6)
  1912.         move.w    #$1241,$100(a6)
  1913.         move.w    #0,$108(a6)
  1914.         move.w    #-80,$10a(a6)
  1915.  
  1916.         move.w    #$0000,$1fc(a6)
  1917.  
  1918.         move.w #$0071,$1c0(a6)
  1919.         move.w #$0008,$1c4(a6)
  1920.         move.w #$000e,$1de(a6)
  1921.         move.w #$001c,$1c2(a6)
  1922.         move.w #$001e,$1c6(a6)
  1923.         move.w #$0046,$1e2(a6)
  1924.         move.w #$020c,$1c8(a6)
  1925.         move.w #$0000,$1cc(a6)
  1926.         move.w #$0003,$1e0(a6)
  1927.         move.w #$0200,$1e4(a6)
  1928.         move.w #$0005,$1ca(a6)
  1929.         move.w #$001d,$1ce(a6)
  1930.         move.w #$0012,$104(a6)
  1931.         move.w #$0c21,$106(a6)
  1932.  
  1933.         move.w    color0,$180(a6)
  1934.         move.w    color1,$182(a6)
  1935.  
  1936.         bra.b    .okmode
  1937.  
  1938. .nomulti
  1939.         move.l    #$90010000,$100(a6)
  1940.         move.l    #$30812cc1,$8e(a6)
  1941.         move.w    #$20,$1dc(a6)
  1942.  
  1943.         move.l    d0,$e0(a6)
  1944.         move.w    #$0c00,$106(a6)
  1945.         move.w    #$0000,$10c(a6)
  1946.         move.w    color0,$180(a6)
  1947.         move.w    color1,$182(a6)
  1948.         move.l    #$003c00d4,$92(a6)
  1949.         move.w    #0,$108(a6)
  1950.  
  1951.         move.w    #0,$1fc(a6)
  1952.  
  1953. .okmode
  1954.  
  1955.  
  1956.         tst.b    trace_moni        ;test if in Tracer
  1957.         bne.b    .no_cur
  1958.         bsr    do_cursor
  1959. .no_cur
  1960.         tst.w    time_repeat
  1961.         bmi.b    no_sub_repeat
  1962.         subq.w    #1,time_repeat        ;for repeat key
  1963. no_sub_repeat
  1964.         bsr    do_watch
  1965.  
  1966.         bsr.b    newirq2
  1967.  
  1968.         move.w    #$20,$9c(a6)        ;interrupt ACK
  1969.         movem.l    (a7)+,d0-d7/a0-a6
  1970.         rte
  1971.  
  1972. ; "IRQ handler" of CIA-A (keyboard)
  1973.  
  1974. newirq2        movem.l    d0-d1/a0/a1/a5-a6,-(a7)
  1975.         lea.l    $dff000,a6
  1976.  
  1977.         move.b    $bfed01,d0
  1978.         btst    #3,d0            ;test if interrupt from keyboard
  1979.         beq    .pas_key
  1980.  
  1981.         move.b    $bfec01,d0        ;get key
  1982.         not.b    d0
  1983.         ror.b    #1,d0
  1984.  
  1985.         cmp.b    #$78,d0
  1986.         beq.w    go_reset
  1987.  
  1988.         cmp.b    #$45,d0
  1989.         bne.b    .no_break
  1990.         st    break
  1991. .no_break
  1992.         tst.b    new_key            ;test if waiting for key-pressed
  1993.         bne.b    .no_buf
  1994.  
  1995.         cmp.w    #64-1,nb_keys
  1996.         beq.b    .pas_key
  1997.  
  1998.         lea.l    key_buffer,a0
  1999.         move.w    nb_keys,d1
  2000.         move.b    d0,(a0,d1.w)        ;save key in key buffer
  2001.         addq.w    #1,nb_keys
  2002. .no_buf        btst    #7,d0
  2003.         bne.b    .nonew
  2004.         sf    new_key
  2005. .nonew        bset    #6,$bfee01
  2006.         moveq    #3-1,d1
  2007. .wait        move.b    6(a6),d0        ;wait 3 raster lines
  2008. .ras        cmp.b    6(a6),d0
  2009.         beq.b    .ras
  2010.         dbf    d1,.wait
  2011.         bclr    #6,$bfee01
  2012. .pas_key
  2013.         movem.l    (a7)+,d0-d1/a0/a1/a5-a6
  2014.         rts
  2015.  
  2016.  
  2017. ********************************************************************
  2018. ;------------- Display the actual address of a search process ------
  2019. ;------------- at the bottom of the screen -------------------------
  2020.  
  2021. do_watch    movem.l    d0-d3/a0-a1,-(a7)
  2022.  
  2023.         lea.l    watch_txt,a0
  2024.         moveq    #8,d1
  2025.         move.l    watch,d0
  2026.         bsr    conv_hex
  2027.  
  2028.         lea.l    watch_txt,a0
  2029.         moveq    #31,d0
  2030.         move.w    screen_height,d1
  2031.         subq.w    #1,d1
  2032.         moveq    #8-1,d3
  2033. .print        move.b    (a0)+,d2
  2034.         bsr    print_char2
  2035.         addq.w    #1,d0
  2036.         dbf    d3,.print
  2037.  
  2038.         move.w    drive,d2
  2039.         add.b    #'0'-3,d2
  2040.         moveq    #18,d0
  2041.         move.w    screen_height,d1
  2042.         subq.w    #1,d1
  2043.         bsr    print_char2
  2044.  
  2045.         lea.l    track,a1
  2046.         move.w    drive,d0
  2047.         add.w    d0,d0
  2048.         move.w    -3*2(a1,d0.w),d0
  2049.         lea.l    watch_txt,a0
  2050.         lsr.w    #1,d0
  2051.         moveq    #0,d1
  2052.         move.b    #128+2,d1
  2053.         bsr    conv_dec
  2054.         moveq    #7,d0
  2055.         move.w    screen_height,d1
  2056.         subq.w    #1,d1
  2057.         moveq    #2-1,d3
  2058.         lea.l    watch_txt+1,a0
  2059. .print2        move.b    (a0)+,d2
  2060.         bsr    print_char2
  2061.         addq.w    #1,d0
  2062.         dbf    d3,.print2
  2063.  
  2064.  
  2065.         movem.l    (a7)+,d0-d3/a0-a1
  2066.         rts
  2067.  
  2068. *******************************************************
  2069. ;print ascII page
  2070.  
  2071. print_page    movem.l    d0-d1,-(a7)
  2072.         moveq    #0,d0
  2073.         move.w    screen_height,d1
  2074.         subq.w    #1,d1
  2075. next_page_all    bsr    print_line
  2076.         addq.w    #1,d0
  2077.         dbf    d1,next_page_all
  2078.         movem.l    (a7)+,d0-d1
  2079.         rts
  2080.  
  2081. ************************************************************
  2082. ;-------------- handle all special keys --------------------
  2083. ;-------------- shift,backspace,F1-F10,etc... --------------
  2084.  
  2085. special_keys    lea.l    key,a0
  2086.         move.b    (a0),d0
  2087.         cmp.b    #$7f,d0
  2088.         beq.w    no_special_keys
  2089.  
  2090.         cmp.b    #$60,d0
  2091.         blt.b    no_shift_on
  2092.         cmp.b    #$62,d0
  2093.         bgt.b    no_shift_on
  2094.         st    shift_mode
  2095.         move.b    #$7f,(a0)
  2096.  
  2097. no_shift_on    cmp.b    #$60+$80,d0
  2098.         blt.b    no_shift_off
  2099.         cmp.b    #$62+$80,d0
  2100.         bgt.b    no_shift_off
  2101.         sf    shift_mode
  2102.         move.b    #$7f,(a0)
  2103. no_shift_off
  2104.         cmp.b    #$63,d0
  2105.         bne.b    .no_ctrl_on
  2106.         st    ctrl_mode
  2107.         move.b    #$7f,(a0)
  2108. .no_ctrl_on
  2109.         cmp.b    #$63+$80,d0
  2110.         bne.b    .no_ctrl_off
  2111.         sf    ctrl_mode
  2112.         move.b    #$7f,(a0)
  2113. .no_ctrl_off
  2114.         cmp.b    #$64,d0
  2115.         beq.b    .alt_on
  2116.         cmp.b    #$65,d0
  2117.         bne.b    .no_alt_on
  2118. .alt_on        st    alt_mode
  2119.         move.b    #$7f,(a0)
  2120. .no_alt_on
  2121.         cmp.b    #$64+$80,d0
  2122.         beq.b    .alt_off
  2123.         cmp.b    #$65+$80,d0
  2124.         bne.b    .no_alt_off
  2125. .alt_off    sf    alt_mode
  2126.         move.b    #$7f,(a0)
  2127. .no_alt_off
  2128.         cmp.b    #$66,d0
  2129.         beq.b    .amiga_on
  2130.         cmp.b    #$67,d0
  2131.         bne.b    .no_amiga_on
  2132. .amiga_on    st    amiga_mode
  2133.         move.b    #$7f,(a0)
  2134. .no_amiga_on
  2135.         cmp.b    #$66+$80,d0
  2136.         beq.b    .amiga_off
  2137.         cmp.b    #$67+$80,d0
  2138.         bne.b    .no_amiga_off
  2139. .amiga_off    sf    amiga_mode
  2140.         move.b    #$7f,(a0)
  2141. .no_amiga_off
  2142.  
  2143.         tst.b    d0
  2144.         bmi.w    no_special_keys
  2145.  
  2146.         lea.l    cursor_x,a3
  2147.  
  2148.         tst.b    trace_moni
  2149.         bne.w    no_speck1
  2150.  
  2151.         cmp.b    #$45,d0
  2152.         bne.b    no_esc
  2153.         move.b    #$7f,(a0)
  2154. no_esc
  2155.  
  2156. ;-------------- Return -------------------------------
  2157.         cmp.b    #$43,d0
  2158.         beq.b    ok_return
  2159.         cmp.b    #$44,d0
  2160.         bne.b    no_cr
  2161.  
  2162. ok_return    bsr    clear_cursor
  2163.         clr.w    (a3)
  2164.         move.b    #$7f,(a0)
  2165.  
  2166.         clr.w    (a3)
  2167.         move.w    window_bot,d1
  2168.         cmp.w    2(a3),d1
  2169.         bgt.b    ok_do_cr
  2170.         bsr    scroll_up
  2171.         subq.w    #1,2(a3)
  2172. ok_do_cr    addq.w    #1,2(a3)
  2173.  
  2174.         bsr    command_line
  2175.  
  2176.         bsr    set_cursor
  2177. no_cr
  2178. ;-------------- arrow keys --------------------------
  2179.  
  2180.         cmp.b    #$4f,d0
  2181.         bne.b    no_left
  2182.         move.b    #$7f,(a0)
  2183.         bsr    clear_cursor
  2184.         tst.b    shift_mode
  2185.         beq.b    .no_sh
  2186.         clr.w    (a3)
  2187.         bra.b    .ok_sh
  2188. .no_sh        tst.w    (a3)
  2189.         bne.b    .ok_left_edge
  2190.         move.w    #80,(a3)        ;-1 -> 79
  2191.         tst.w    2(a3)
  2192.         bne.b    .ok_top_edge
  2193.         addq.w    #1,2(a3)        ;keep 0 coz -1 later
  2194.         bsr    scroll_down
  2195. .ok_top_edge    subq.w    #1,2(a3)
  2196. .ok_left_edge    subq.w    #1,(a3)
  2197. .ok_sh        bsr    set_cursor
  2198.  
  2199. no_left        cmp.b    #$4e,d0
  2200.         bne.b    no_right
  2201.         move.b    #$7f,(a0)
  2202.         bsr    clear_cursor
  2203.         tst.b    shift_mode
  2204.         beq.b    .no_sh
  2205.         move.w    #79,(a3)
  2206.         bra.b    .ok_sh
  2207. .no_sh        cmp.w    #79,(a3)
  2208.         blt.b    .ok_right_edge
  2209.         move.w    #-1,(a3)
  2210.         move.w    window_bot,d1
  2211.         cmp.w    2(a3),d1
  2212.         bgt.b    .ok_bot_edge
  2213.         subq.w    #1,2(a3)        ;keep 24 coz +1 later
  2214.         bsr    scroll_up
  2215. .ok_bot_edge    addq.w    #1,2(a3)
  2216. .ok_right_edge    addq.w    #1,(a3)
  2217. .ok_sh        bsr    set_cursor
  2218.  
  2219. no_right
  2220.         cmp.b    #$4c,d0
  2221.         bne.w    no_up
  2222.         move.b    #$7f,(a0)
  2223.         bsr    clear_cursor
  2224.  
  2225.         tst.b    shift_mode
  2226.         beq.b    .noshift
  2227.         move.w    (2,a3),d1
  2228.         clr.w    (2,a3)            ;move cursor to top of screen
  2229.         tst.w    d1
  2230.         beq.b    .no_ctrl
  2231.         bra.w    .end_up
  2232.  
  2233. .noshift    tst.b    ctrl_mode
  2234.         beq.b    .no_ctrl
  2235.         movem.l    d0/a0,-(a7)
  2236.         clr.w    (a3)
  2237.         moveq    #16-1,d1            ;nb history lines
  2238. .loop        subq.w    #1,history_disp
  2239.         and.w    #$f,history_disp
  2240.         move.w    history_disp,d0
  2241.         mulu    #80,d0
  2242.         lea.l    history,a0
  2243.         add.l    d0,a0
  2244.         tst.b    (a0)
  2245.         dbne    d1,.loop
  2246.         bsr    print
  2247.         lea.l    79(a0),a0
  2248. .back        cmp.b    #' ',-(a0)
  2249.         bne.b    .no_spc
  2250.         subq.w    #1,(a3)
  2251.         bra.b    .back
  2252. .no_spc        movem.l    (a7)+,d0/a0
  2253.         bra.b    .end_up
  2254.  
  2255. .no_ctrl    tst.w    2(a3)
  2256.         bne.b    .ok_up
  2257.         moveq    #1,d2            ;scroll 1 line
  2258.         tst.b    shift_mode
  2259.         beq.b    .no_sh2
  2260.         clr.w    (a3)
  2261.         moveq    #SC_STEP,d2
  2262. .no_sh2        movem.l    d0-a4,-(a7)
  2263.         move.l    last_cmd,a0
  2264.         tst.l    (12,a0)
  2265.         sne    no_sc_clr
  2266.         bsr    scroll_down2
  2267.         move.l    (12,a0),d0
  2268.         beq.b    .no_up_cmd
  2269.         move.l    d0,a1
  2270.         jsr    (a1)
  2271.         beq.b    .no_up_cmd
  2272.         bsr    print_page
  2273. .no_up_cmd    movem.l    (a7)+,d0-a4
  2274.         bra.b    .end_up
  2275. .ok_up        subq.w    #1,2(a3)
  2276. .end_up        bsr    set_cursor
  2277.  
  2278. no_up
  2279.         cmp.b    #$4d,d0
  2280.         bne.w    no_down
  2281.         move.b    #$7f,(a0)
  2282.         bsr    clear_cursor
  2283.  
  2284.         tst.b    shift_mode
  2285.         beq.b    .noshift
  2286.         move.w    (2,a3),d1
  2287.         move.w    window_bot,(2,a3)    ;move cursor to bot. of screen
  2288.         cmp.w    window_bot,d1
  2289.         beq.b    .no_ctrl
  2290.         bra.w    .end_down
  2291.  
  2292. .noshift    tst.b    ctrl_mode
  2293.         beq.b    .no_ctrl
  2294.         movem.l    d0/a0,-(a7)
  2295.         clr.w    (a3)
  2296.         moveq    #16-1,d1
  2297. .loop        addq.w    #1,history_disp
  2298.         and.w    #$f,history_disp
  2299.         move.w    history_disp,d0
  2300.         mulu    #80,d0
  2301.         lea.l    history,a0
  2302.         add.l    d0,a0
  2303.         tst.b    (a0)
  2304.         dbne    d1,.loop
  2305.         bsr    print
  2306.         lea.l    79(a0),a0
  2307. .back        cmp.b    #' ',-(a0)
  2308.         bne.b    .no_spc
  2309.         subq.w    #1,(a3)
  2310.         bra.b    .back
  2311. .no_spc        movem.l    (a7)+,d0/a0
  2312.         bra.b    .end_down
  2313.  
  2314. .no_ctrl    move.w    window_bot,d1
  2315.         cmp.w    2(a3),d1
  2316.         bgt.b    .ok_down
  2317.         moveq    #1,d2            ;scroll 1 line
  2318.         tst.b    shift_mode
  2319.         beq.b    .no_sh2
  2320.         clr.w    (a3)
  2321.         moveq    #SC_STEP,d2
  2322. .no_sh2        movem.l    d0-a4,-(a7)
  2323.         move.l    last_cmd,a0
  2324.         tst.l    (16,a0)
  2325.         sne    no_sc_clr
  2326.         bsr    scroll_up2
  2327.         move.l    (16,a0),d0
  2328.         beq.b    .no_down_cmd
  2329.         move.l    d0,a1
  2330.         jsr    (a1)
  2331.         beq.b    .no_down_cmd
  2332.         bsr    print_page
  2333. .no_down_cmd    movem.l    (a7)+,d0-a4
  2334.         bra.b    .end_down
  2335. .ok_down    addq.w    #1,2(a3)
  2336. .end_down    bsr    set_cursor
  2337. no_down
  2338.  
  2339. ;-------------- switch Tracer page ON/OFF F7 --------------
  2340. no_speck1    cmp.b    #$56,d0
  2341.         bne.b    .no_f7
  2342.         move.b    #$7f,(a0)
  2343.         not.b    trace_moni
  2344.         beq.b    .quittracer
  2345.         bsr    clear_cursor
  2346.         move.l    #ascII_Tracer,d1
  2347.         move.w    #MAX_SCREEN,d2
  2348.         sub.w    screen_height,d2
  2349.         mulu    #80,d2
  2350.         add.l    d2,d1
  2351.         move.l    d1,ascII_ptr
  2352.         bsr    print_page
  2353.         st    trace_moni
  2354.         move.l    cursor_x,old_cursor
  2355.         st    tracer_refresh
  2356.         bra.b    .endF7
  2357.  
  2358. .quittracer    bsr    clear_cursor
  2359.         move.l    old_cursor,cursor_x
  2360.         lea.l    ascII_ptr,a1
  2361.         movem.l    4(a1),d0-d1        ;read ascII_page1,2 ptrs
  2362.         tst.b    ascII_page    ;flip page flag
  2363.         bne.b    .noex2
  2364.         exg    d0,d1
  2365. .noex2        move.l    d1,(a1)            ;set actual page ptr
  2366.         bsr    print_page
  2367.         bsr    set_cursor
  2368. .endF7
  2369.  
  2370. ;-------------- switch page 1/2 F10 -----------------------
  2371. .no_f7
  2372.         cmp.b    #$59,d0
  2373.         bne.b    no_f10
  2374.         move.b    #$7f,(a0)
  2375.         tst.b    trace_moni
  2376.         bne.b    no_f10
  2377.         bsr    clear_cursor
  2378.         lea.l    ascII_ptr,a1
  2379.         movem.l    4(a1),d1-d2        ;read ascII_page1,2 ptrs
  2380.         not.b    ascII_page    ;flip page flag
  2381.         bne.b    .noex
  2382.         exg    d1,d2
  2383. .noex        move.l    d2,(a1)            ;set actual page ptr
  2384.         bsr    print_page
  2385.         bsr    set_cursor
  2386. no_f10
  2387.  
  2388. ;-------------- Clear screen F1 -----------------
  2389.         tst.b    trace_moni
  2390.         bne.w    no_speck2
  2391.  
  2392.         cmp.b    #$50,d0
  2393.         bne.b    no_f1
  2394.         move.b    #$7f,(a0)
  2395.         bsr    clear_cursor
  2396.         move.l    ascII_ptr,a1
  2397.         move.w    window_top,d2
  2398.         mulu    #80,d2
  2399.         add.l    d2,a1
  2400.         move.l    #'    ',d1
  2401.         move.w    window_bot,d2
  2402.         sub.w    window_top,d2
  2403.         addq.w    #1,d2
  2404.         mulu    #20,d2
  2405.         subq.w    #1,d2
  2406. clear_ascII    move.l    d1,(a1)+
  2407.         dbf    d2,clear_ascII
  2408.         bsr    print_page
  2409.         moveq    #0,d1
  2410.         move.w    window_top,d1
  2411.         move.l    d1,cursor_x
  2412.         bsr    set_cursor
  2413. no_f1
  2414. ;-------------- change insert mode F2 -----------
  2415.         cmp.b    #$51,d0
  2416.         bne.b    no_f2
  2417.         move.b    #$7f,(a0)
  2418.         movem.l    d0/a0,-(a7)
  2419.         lea.l    insert_off_txt,a0
  2420.         not.b    insert_mode
  2421.         beq.b    ok_ins_off
  2422.         lea.l    insert_on_txt,a0
  2423. ok_ins_off    moveq    #76,d0
  2424.         move.w    screen_height,d1
  2425.         subq.w    #1,d1
  2426.         moveq    #3-1,d3
  2427. .loop        move.b    (a0)+,d2
  2428.         bsr    print_char2
  2429.         addq.w    #1,d0
  2430.         dbf    d3,.loop
  2431.         movem.l    (a7)+,d0/a0
  2432. no_f2
  2433.  
  2434. ;-------------- change FCPU F6 ------------------
  2435.         cmp.b    #$55,d0
  2436.         bne.b    .no_f5
  2437.         move.b    #$7f,(a0)
  2438.         tst.b    fami_mode
  2439.         beq.b    .was802
  2440.         bsr    set_65802
  2441.         bra.b    .no_f5
  2442. .was802        bsr    set_65816
  2443. .no_f5
  2444. ;-------------- backspace -----------------------
  2445.         cmp.b    #$41,d0
  2446.         bne.w    no_back
  2447.         move.b    #$7f,(a0)
  2448.         tst.b    shift_mode    ;shift+backspace -> clear line
  2449.         beq.b    .no_clr
  2450.  
  2451.         bsr    clear_cursor
  2452.         move.w    d0,-(a7)
  2453.         move.l    ascII_ptr,a1
  2454.         move.w    2(a3),d0
  2455.         mulu    #80,d0
  2456.         add.l    d0,a1
  2457.         moveq    #80-1,d0
  2458. .fill        move.b    #' ',(a1)+
  2459.         dbf    d0,.fill
  2460.         clr.w    (a3)
  2461.         move.w    2(a3),d0
  2462.         bsr    print_line
  2463.         move.w    (a7)+,d0
  2464.         bsr    set_cursor
  2465.         bra.b    no_back
  2466.  
  2467. .no_clr        tst.w    (a3)
  2468.         beq.b    no_back
  2469.         bsr    clear_cursor
  2470.         move.l    ascII_ptr,a1
  2471.         add.w    (a3),a1            ;add x cursor
  2472.         subq.w    #1,a1
  2473.         move.w    2(a3),d1
  2474.         mulu    #80,d1
  2475.         add.l    d1,a1            ;add y cursor
  2476.         lea.l    1(a1),a2
  2477.         moveq    #80-1,d1
  2478.         sub.w    (a3),d1
  2479. scroll_line    move.b    (a2)+,(a1)+
  2480.         dbf    d1,scroll_line
  2481.         move.b    #' ',(a1)+
  2482.         move.w    d0,-(a7)
  2483.         move.w    2(a3),d0
  2484.         bsr    print_line
  2485.         move.w    (a7)+,d0
  2486.         subq.w    #1,(a3)
  2487.         bsr    set_cursor
  2488. no_back
  2489. ;-------------- del -----------------------------
  2490.         cmp.b    #$46,d0
  2491.         bne.b    no_del
  2492.         move.b    #$7f,(a0)
  2493.         bsr    clear_cursor
  2494.  
  2495.         tst.b    shift_mode
  2496.         beq.b    .do_del
  2497.  
  2498.         move.l    ascII_ptr,a1
  2499.         move.w    2(a3),d1
  2500.         mulu    #80,d1
  2501.         add.l    d1,a1
  2502.         lea.l    80(a1),a1
  2503.         lea.l    -1(a1),a2
  2504.         moveq    #80-2,d1
  2505.         sub.w    (a3),d1
  2506.         bmi.b    end_del
  2507. .l        move.b    -(a2),-(a1)
  2508.         dbf    d1,.l
  2509.         move.b    #' ',(a2)
  2510.         bra.b    end_del
  2511.  
  2512. .do_del        move.l    ascII_ptr,a1
  2513.         add.w    (a3),a1            ;add x cursor
  2514.         move.w    2(a3),d1
  2515.         mulu    #80,d1
  2516.         add.l    d1,a1            ;add y cursor
  2517.         lea.l    1(a1),a2
  2518.         moveq    #80-1,d1
  2519.         sub.w    (a3),d1
  2520.         bra.b    do_dbf_scroll
  2521. scroll_line2    move.b    (a2)+,(a1)+
  2522. do_dbf_scroll    dbf    d1,scroll_line2
  2523.         move.b    #' ',(a1)+
  2524. end_del        move.w    d0,-(a7)
  2525.         move.w    2(a3),d0
  2526.         bsr    print_line
  2527.         move.w    (a7)+,d0
  2528.         bsr    set_cursor
  2529.  
  2530. no_del
  2531. ;-------------- HELP print help page ---------------
  2532.  
  2533.         cmp.b    #$5f,d0
  2534.         bne.b    no_help
  2535.         move.b    #$7f,(a0)
  2536.         move.l    a0,-(a7)
  2537.         lea.l    help_txt,a0
  2538.         bsr    print_curs
  2539.         tst.b    break
  2540.         beq.b    .nobrk
  2541.         sf    break
  2542.         lea.l    break_txt,a0
  2543.         bsr    print
  2544. .nobrk        move.l    (a7)+,a0
  2545. no_help
  2546. no_speck2
  2547. no_special_keys    rts
  2548.  
  2549. ;------------------------------------------------
  2550. ;-------------- handle normal keys --------------
  2551. ;-------------- 0-9,a-z,etc... ------------------
  2552.  
  2553. normal_keys    lea.l    key,a0
  2554.         tst.b    snap_buf
  2555.         beq.b    .nos
  2556.         move.b    #$40,(a0)
  2557. .nos        moveq    #0,d0
  2558.         move.b    (a0),d0
  2559.         cmp.b    #$7f,d0
  2560.         beq.w    no_normal_keys
  2561.  
  2562.         move.b    #$7f,(a0)
  2563.  
  2564.         tst.b    d0
  2565.         bmi.w    no_normal_keys
  2566.  
  2567.         bsr    clear_cursor
  2568.  
  2569.         move.l    board_ptr,a1
  2570.         tst.b    shift_mode
  2571.         beq.b    no_shift_mode
  2572.         move.l    board_ptr+4,a1
  2573. no_shift_mode    tst.b    alt_mode
  2574.         beq.b    .no_alt
  2575.         move.l    board_ptr+8,a1
  2576. .no_alt        move.b    (a1,d0.w),d2
  2577.  
  2578.         move.l    a0,-(a7)
  2579.         lea.l    snap_buf,a0
  2580.         tst.b    (a0)
  2581.         beq.b    empty_snap
  2582.  
  2583. resnap        move.b    (a0)+,d2
  2584.  
  2585. empty_snap    lea.l    cursor_x,a3
  2586.  
  2587.         tst.b    insert_mode
  2588.         beq.b    no_insert_mode
  2589. ;-------------- do insert mode -----------------
  2590.         cmp.w    #79,(a3)
  2591.         bge.b    ok_cursor_pos
  2592.         move.l    ascII_ptr,a1
  2593.         move.l    a1,a2
  2594.         add.w    (a3),a1
  2595.         move.w    2(a3),d0
  2596.         mulu    #80,d0
  2597.         add.l    d0,a1
  2598.         add.l    d0,a2
  2599.         lea.l    80(a2),a2
  2600.         lea.l    -1(a2),a4
  2601. do_insert    move.b    -(a4),-(a2)
  2602.         cmp.l    a1,a4
  2603.         bne.b    do_insert
  2604.         move.b    d2,(a1)
  2605.         addq.w    #1,(a3)
  2606.         move.w    2(a3),d0
  2607.         bsr    print_line
  2608.         bra.b    ok_cursor_pos
  2609. ;-----------------------------------------------
  2610. no_insert_mode
  2611.         movem.w    (a3),d0-d1
  2612.         bsr    print_char
  2613.  
  2614.         addq.w    #1,(a3)
  2615.         cmp.w    #80,(a3)
  2616.         blt.b    ok_cursor_pos
  2617.         clr.w    (a3)
  2618.         move.w    window_bot,d1
  2619.         cmp.w    2(a3),d1
  2620.         bgt.b    ok_cursor_h
  2621.         bsr    scroll_up
  2622.         bra.b    ok_cursor_pos
  2623. ok_cursor_h    addq.w    #1,2(a3)
  2624.  
  2625. ok_cursor_pos
  2626.         tst.b    (a0)
  2627.         bne.w    resnap
  2628.  
  2629.         sf    snap_buf
  2630.  
  2631.         move.l    (a7)+,a0
  2632.  
  2633.         bsr    set_cursor
  2634.  
  2635. no_normal_keys    rts
  2636.  
  2637. ************************************************************
  2638. ;-------------- called when RETURN is pressed --------------
  2639.  
  2640. command_line    movem.l    d0-d7/a0-a4,-(a7)
  2641.         lea.l    cursor_x,a3
  2642.         move.w    2(a3),d0        ;read y pos
  2643.         subq.w    #1,d0
  2644.         move.l    ascII_ptr,a0
  2645.         mulu    #80,d0
  2646.         add.l    d0,a0
  2647.         lea.l    command,a1
  2648.         moveq    #80-1,d1
  2649. copy_command    move.b    (a0)+,(a1)+        ;copy current line into
  2650.         dbf    d1,copy_command        ;command
  2651.  
  2652.         sf    d4            ;command repeat signal off
  2653.         lea.l    command,a0
  2654. seek_command    move.b    (a0)+,d0        ;seek command first char
  2655.         beq.b    end_cmd_line
  2656.         cmp.b    #$20,d0
  2657.         beq.b    seek_command
  2658.         bra.b    ok_new_cmd
  2659.  
  2660. end_cmd_line    subq.w    #1,2(a3)        ;if command line is empty
  2661.         move.l    last_cmd,a0        ;then repeat last command
  2662.         addq.l    #1,a0
  2663.         st    d4            ;signal in d4 for cmd repeat
  2664. ok_new_cmd
  2665.         subq.l    #1,a0
  2666.         lea.l    cmd_list,a2
  2667.         moveq    #0,d1            ;command code offset cleared
  2668.  
  2669. .loop2        tst.b    (a2)            ;search if command
  2670.         beq.b    end_cmd_list        ;exists
  2671.         move.l    a2,a3
  2672.         move.l    a0,a1
  2673. .loop        move.b    (a3)+,d3
  2674.         beq.b    .ok_cmp
  2675.         move.b    (a1)+,d0
  2676.         bsr    upper_case
  2677.         cmp.b    d0,d3
  2678.         beq.b    .loop
  2679.  
  2680. .go1        lea.l    20(a2),a2        ;next command in cmd_list
  2681.         bra.b    .loop2
  2682.  
  2683. .ok_cmp        move.l    8(a2),d1        ;command code offset
  2684.         cmp.l    #cmd_x,d1
  2685.         beq.b    .nolast            ;cant't repeat cmd_x
  2686.         move.l    a2,last_cmd
  2687. .nolast        move.l    a1,d2
  2688.         bra.b    .go1            ;check if it's really this cmd
  2689.                         ;to get the longest cmd.
  2690.  
  2691. end_cmd_list    sf    break
  2692.         tst.l    d1
  2693.         beq.b    no_command
  2694.  
  2695.         tst.b    d4            ;test if cmd repeat ?
  2696.         bne.b    .no_hist
  2697.  
  2698.         lea.l    history_cnt,a2
  2699.         move.w    (a2),d0
  2700.         lea.l    history,a0
  2701.         mulu    #80,d0
  2702.         add.l    d0,a0
  2703.         lea.l    command,a1
  2704.         moveq    #79-1,d0
  2705. .copy        move.b    (a1)+,(a0)+        ;copy command in history
  2706.         dbf    d0,.copy
  2707.  
  2708.         addq.w    #1,(a2)
  2709.         and.w    #$f,(a2)        ;maxi 16 history lines
  2710.         move.w    (a2),history_disp
  2711.  
  2712. .no_hist    st    no_curs
  2713.         move.l    d2,a0
  2714.         lea.l    cmd_list(pc),a5
  2715.  
  2716.         sf    disk_op
  2717.         sf    floppy_op
  2718.  
  2719.         move.l    a7,cmd_sp_save
  2720.         st    cmd_executed
  2721.         sf    cmd_crashed
  2722.  
  2723.         move.l    d1,-(a7)        ;jmp (d1.l) exec. the cmd
  2724.         rts
  2725.  
  2726. no_command    lea.l    unknown_txt,a0
  2727.         bsr    print
  2728.         move.l    a7,cmd_sp_save
  2729.  
  2730. end_command    sf    cmd_executed
  2731. ;try to recover from eventual command crash
  2732.         move.l    cmd_sp_save(pc),a7
  2733.         bsr    set_pic
  2734.         move.w    #$2000,sr
  2735.  
  2736.         bsr    end_disk
  2737.  
  2738.         tst.b    cmd_crashed
  2739.         beq.b    .nocrash
  2740.         lea.l    .crash_txt(pc),a0
  2741.         bsr    print
  2742.         lea.l    crash_stack,a0
  2743.         jsr    _ShowEntryReason
  2744.  
  2745. .nocrash
  2746.         tst.b    break            ;ESC pressed during
  2747.         beq.b    .no_break        ;command ?
  2748.         sf    break
  2749.         lea.l    break_txt,a0
  2750.         bsr    print
  2751. .no_break
  2752.         sf    no_curs
  2753.  
  2754.         movem.l    (a7)+,d0-d7/a0-a4
  2755.         rts
  2756.  
  2757. .crash_txt    dc.b "*** command crashed ***",$a,0
  2758.  
  2759.         cnop 0,4
  2760. cmd_sp_save    dc.l 0
  2761.  
  2762. ************************************************************
  2763.         cnop 0,4
  2764.  
  2765. ;-------------- cmds ordered by size -----------------------
  2766. ;cmd format
  2767. ;----------
  2768. ;dc.b cmd name padded with 0 (8 bytes)
  2769. ;dc.l ptr to code, ptr to line up code, ptr to line down code
  2770.  
  2771. cmd_list:    dc.b 'R',0,0,0,0,0,0,0
  2772.         dc.l cmd_r,0,0
  2773.         dc.b 'H',0,0,0,0,0,0,0
  2774.         dc.l cmd_h,cmdu_h,cmdd_h
  2775.         dc.b 'M',0,0,0,0,0,0,0
  2776.         dc.l cmd_h,cmdu_h,cmdd_h
  2777.         dc.b 'D',0,0,0,0,0,0,0
  2778.         dc.l cmd_a,cmdu_d,cmdd_d
  2779.         dc.b 'B',0,0,0,0,0,0,0
  2780.         dc.l cmd_b,0,0
  2781.         dc.b 'C',0,0,0,0,0,0,0
  2782.         dc.l cmd_c,0,0
  2783.         dc.b 'T',0,0,0,0,0,0,0
  2784.         dc.l cmd_t,0,0
  2785.         dc.b 'N',0,0,0,0,0,0,0
  2786.         dc.l cmd_n,cmdu_n,cmdd_n
  2787.         dc.b 'P',0,0,0,0,0,0,0
  2788.         dc.l cmd_p,0,0
  2789.         dc.b '?',0,0,0,0,0,0,0
  2790.         dc.l cmd_ev,0,0
  2791.         dc.b 'L',0,0,0,0,0,0,0
  2792.         dc.l cmd_l,0,0
  2793.         dc.b 'X',0,0,0,0,0,0,0
  2794.         dc.l cmd_x,0,0
  2795.         dc.b 'G',0,0,0,0,0,0,0
  2796.         dc.l cmd_g,0,0
  2797.         dc.b 'F',0,0,0,0,0,0,0
  2798.         dc.l cmd_f,0,0
  2799.         dc.b 'O',0,0,0,0,0,0,0
  2800.         dc.l cmd_o,0,0
  2801.         dc.b 'A',0,0,0,0,0,0,0
  2802.         dc.l cmd_a,0,0
  2803.         dc.b 'S',0,0,0,0,0,0,0
  2804.         dc.l cmd_s,0,0
  2805.         dc.b 'Q',0,0,0,0,0,0,0
  2806.         dc.l cmd_q,0,0
  2807.         dc.b 'E',0,0,0,0,0,0,0
  2808.         dc.l cmd_e,cmdu_e,cmdd_e
  2809.  
  2810.         dc.b 'FI',0,0,0,0,0,0
  2811.         dc.l cmd_fi,0,0
  2812.         dc.b 'RS',0,0,0,0,0,0
  2813.         dc.l cmd_disk1,0,0
  2814.         dc.b 'WS',0,0,0,0,0,0
  2815.         dc.l cmd_disk2,0,0
  2816.         dc.b 'CD',0,0,0,0,0,0
  2817.         dc.l cmd_cd,0,0
  2818.         dc.b 'DF',0,0,0,0,0,0
  2819.         dc.l cmd_df,0,0
  2820.         dc.b 'AF',0,0,0,0,0,0
  2821.         dc.l cmd_af,0,0
  2822.         dc.b 'TS',0,0,0,0,0,0
  2823.         dc.l cmd_ts,0,0
  2824.         dc.b 'TF',0,0,0,0,0,0
  2825.         dc.l cmd_tf,0,0
  2826.         dc.b 'SA',0,0,0,0,0,0
  2827.         dc.l cmd_sa,0,0
  2828.         dc.b 'LA',0,0,0,0,0,0
  2829.         dc.l cmd_la,0,0
  2830.         dc.b 'LS',0,0,0,0,0,0
  2831.         dc.l cmd_dir,0,0
  2832.         dc.b 'SP',0,0,0,0,0,0
  2833.         dc.l cmd_sp,0,0
  2834.         dc.b 'BB',0,0,0,0,0,0
  2835.         dc.l cmd_bb,0,0
  2836.         dc.b 'FS',0,0,0,0,0,0
  2837.         dc.l cmd_fs,0,0
  2838.         dc.b 'MW',0,0,0,0,0,0
  2839.         dc.l cmd_mw,0,0
  2840.  
  2841.         dc.b 'MWD',0,0,0,0,0
  2842.         dc.l cmd_mwd,0,0
  2843.         dc.b 'TSD',0,0,0,0,0
  2844.         dc.l cmd_tsd,0,0
  2845.          dc.b 'FIF',0,0,0,0,0
  2846.         dc.l cmd_fif,0,0
  2847.         dc.b 'DIR',0,0,0,0,0
  2848.         dc.l cmd_dir,0,0
  2849.         dc.b 'PAL',0,0,0,0,0
  2850.         dc.l cmd_pal,0,0
  2851.         dc.b '31K',0,0,0,0,0
  2852.         dc.l cmd_31k,0,0
  2853.         dc.b 'LED',0,0,0,0,0
  2854.         dc.l cmd_led,0,0
  2855.         dc.b 'IDE',0,0,0,0,0
  2856.         dc.l cmd_ide,0,0
  2857.         dc.b 'DEL',0,0,0,0,0
  2858.         dc.l cmd_del,0,0
  2859.         dc.b 'PWD',0,0,0,0,0
  2860.         dc.l cmd_cd,0,0
  2861.         dc.b 'D2F',0,0,0,0,0
  2862.         dc.l cmd_d2f,0,0
  2863.         dc.b 'F2D',0,0,0,0,0
  2864.         dc.l cmd_f2d,0,0
  2865.         dc.b 'VER',0,0,0,0,0
  2866.         dc.l cmd_ver,0,0
  2867.         dc.b 'SAC',0,0,0,0,0
  2868.         dc.l cmd_sac,0,0
  2869.         dc.b 'COP',0,0,0,0,0
  2870.         dc.l cmd_cop,0,0
  2871.  
  2872.         dc.b 'NTSC',0,0,0,0
  2873.         dc.l cmd_ntsc,0,0
  2874.         dc.b 'TYPE',0,0,0,0
  2875.         dc.l cmd_type,0,0
  2876.         dc.b 'COPY',0,0,0,0
  2877.         dc.l cmd_copy,0,0
  2878.         dc.b 'PART',0,0,0,0
  2879.         dc.l cmd_part,0,0
  2880.         dc.b 'KILL',0,0,0,0
  2881.         dc.l cmd_kill,0,0
  2882.  
  2883.         dc.b 'DRIVE',0,0,0
  2884.         dc.l cmd_drive,0,0
  2885.         dc.b 'DEBUG',0,0,0
  2886.         dc.l cmd_debug,0,0
  2887.         dc.b 'MOTOR',0,0,0
  2888.         dc.l cmd_motor,0,0
  2889.         dc.b 'INTEL',0,0,0
  2890.         dc.l cmd_intel,0,0
  2891.         dc.b 'EXCEP',0,0,0
  2892.         dc.l cmd_excep,0,0
  2893.         dc.b 'MKDIR',0,0,0
  2894.         dc.l cmd_makedir,0,0
  2895.         dc.b 'CLEAR',0,0,0
  2896.         dc.l cmd_clear,0,0
  2897.  
  2898.         dc.b 'REBOOT',0,0
  2899.         dc.l cmd_reboot,0,0
  2900.         dc.b 'FORMAT',0,0
  2901.         dc.l cmd_format,0,0
  2902.         dc.b 'OUTPUT',0,0
  2903.         dc.l cmd_output,0,0
  2904.         dc.b 'SETMAP',0,0
  2905.         dc.l cmd_setmap,0,0
  2906.         dc.b 'HORNET',0,0
  2907.         dc.l cmd_hornet,0,0
  2908.         dc.b 'CHKDSK',0,0
  2909.         dc.l cmd_diskchk,0,0
  2910.  
  2911.         dc.b 'FORMATQ',0
  2912.         dc.l cmd_formatq,0,0
  2913.         dc.b 'DISKCHK',0
  2914.         dc.l cmd_diskchk,0,0
  2915.         dc.b 'MAKEDIR',0
  2916.         dc.l cmd_makedir,0,0
  2917.  
  2918.         dcb.b 8,0
  2919.         dc.l 0,0,0
  2920.  
  2921. ****************************************************************
  2922.  
  2923. cmd_ver        lea.l    ver_txt(pc),a0
  2924.         bsr    print
  2925.         bra.w    end_command
  2926.  
  2927. ver_txt        dc.b "HRTmon v"
  2928.         version            ;x.yz
  2929.         dc.b $a,0
  2930.         even
  2931.  
  2932. ****************************************************************
  2933.  
  2934.         include src/copper.s
  2935.  
  2936. ****************************************************************
  2937. ;-------------- add/remove/view memory watch -------------------
  2938.  
  2939. cmd_mw        moveq    #1,d1
  2940.         cmp.b    #'.',(a0)
  2941.         bne.b    .nosize
  2942.         addq.l    #1,a0
  2943.         move.b    (a0)+,d0
  2944.         bsr    upper_case
  2945.         cmp.b    #'B',d0
  2946.         beq.b    .nosize
  2947.         moveq    #2,d1
  2948.         cmp.b    #'W',d0
  2949.         beq.b    .nosize
  2950.         moveq    #4,d1
  2951.         cmp.b    #'L',d0
  2952.         beq.b    .nosize
  2953.         lea.l    .size_txt(pc),a0
  2954.         bsr    print
  2955.         bra.w    .end
  2956.  
  2957. .nosize        move.b    d1,.tmp_size
  2958.         bsr    evaluate
  2959.         bmi.w    illegal_addr
  2960.         beq.b    .gotaddr
  2961.  
  2962. ;-------------- no param -> view all memory watch ---------
  2963.  
  2964.         lea.l    watch_size(pc),a2
  2965.         lea.l    watch_addr(pc),a1
  2966. .loop        move.b    (a2)+,d2
  2967.         beq.w    .end
  2968.  
  2969.         lea.l    .view_txt(pc),a0
  2970.         bsr    print
  2971.         move.l    (a1)+,d0
  2972.         moveq    #8,d1
  2973.         bsr    print_hex
  2974.         cmp.b    #1,d2
  2975.         bne.b    .nob
  2976.         lea.l    .viewb_txt(pc),a0
  2977.         bsr    print
  2978.         bra.b    .loop
  2979. .nob        cmp.b    #2,d2
  2980.         bne.b    .now
  2981.         lea.l    .vieww_txt(pc),a0
  2982.         bsr    print
  2983.         bra.b    .loop
  2984. .now        lea.l    .viewl_txt(pc),a0
  2985.         bsr    print
  2986.         bra.b    .loop
  2987.  
  2988. ;-------------- set/remove memory watch -------------------
  2989.  
  2990. .gotaddr    move.l    d0,a4
  2991.         lea.l    watch_addr(pc),a0
  2992.         lea.l    watch_size(pc),a1
  2993.         lea.l    watch_orig(pc),a2
  2994. .loop2        addq.l    #4,a2
  2995.         tst.b    (a1)+
  2996.         beq.b    .noremove
  2997.         cmp.l    (a0)+,a4
  2998.         bne.b    .loop2
  2999.         subq.l    #1,a1
  3000.         subq.l    #4,a0
  3001.         subq.l    #4,a2
  3002. .pack        move.l    4(a0),(a0)+
  3003.         move.l    4(a2),(a2)+
  3004.         move.b    1(a1),(a1)+
  3005.         bne.b    .pack
  3006.         lea.l    .remove_txt(pc),a0
  3007.         bsr    print
  3008.         move.l    a4,d0
  3009.         moveq    #8,d1
  3010.         bsr    print_hexCR
  3011.         and.w    #$7fff,sr_reg
  3012.         bra.b    .end
  3013.  
  3014. ;-------------- set memory watch --------------------------
  3015. .noremove    move.l    a4,d0
  3016.         btst    #0,d0
  3017.         beq.b    .okeven
  3018.         tst.w    proc_type
  3019.         bne.b    .okeven
  3020.         lea.l    .even_txt(pc),a0
  3021.         bsr    print
  3022.         bra.b    .end
  3023. .okeven
  3024.         bsr    reloc_pic
  3025.         lea.l    watch_size(pc),a0
  3026.         lea.l    watch_addr(pc),a1
  3027.         lea.l    watch_orig(pc),a2
  3028.         moveq    #MAX_WATCH-1,d0
  3029. .seek        tst.b    (a0)
  3030.         beq.b    .found_empty
  3031.         addq.l    #1,a0
  3032.         addq.l    #4,a1
  3033.         addq.l    #4,a2
  3034.         dbf    d0,.seek
  3035.         lea.l    .toomany_txt(pc),a0
  3036.         bsr    print
  3037.         bra.b    .end
  3038.  
  3039. .found_empty    move.b    .tmp_size(pc),(a0)
  3040.         move.l    a4,(a1)
  3041.         move.l    (a4),(a2)
  3042.  
  3043.         lea.l    .set_txt(pc),a0
  3044.         bsr    print
  3045.         moveq    #8,d1
  3046.         move.l    a4,d0
  3047.         bsr    print_hexCR
  3048.  
  3049. .end        bra.w    end_command
  3050.  
  3051. .tmp_size    dc.b 0
  3052.  
  3053. .size_txt    dc.b "Illegal size specifier ! (only .b .w .l allowed)",$a,0
  3054. .view_txt    dc.b "Memory watch at $",0
  3055. .viewb_txt    dc.b ".b",$a,0
  3056. .vieww_txt    dc.b ".w",$a,0
  3057. .viewl_txt    dc.b ".l",$a,0
  3058. .set_txt    dc.b "Memory watch set at $",0
  3059. .remove_txt    dc.b "Memory watch removed at $",0
  3060. .toomany_txt    dc.b "Too many memory watch !",$a,0
  3061. .even_txt    dc.b "Address must be even ! (only on 68000 processor)",$a,0
  3062.         even
  3063.  
  3064. MAX_WATCH = 16
  3065.  
  3066.         cnop 0,4
  3067. watch_addr    dcb.l MAX_WATCH+1,0    ;address to watch
  3068. watch_orig    dcb.l MAX_WATCH+1,0    ;original value in watched mem.
  3069. watch_size    dcb.b MAX_WATCH+1,0    ;watch size (1,2,4, 0=none)
  3070.  
  3071. watch_flag    dc.b 0            ;-1 when HRTmon entered by memory watch
  3072.         even
  3073. watch_trigger    dc.l 0            ;address which triggered entrance
  3074.         even
  3075.  
  3076. ****************************************************************
  3077. ;-------------- init trace mode if memory watch exists ---------
  3078.  
  3079. init_mwatch    movem.l    a0-a3,-(a7)
  3080.         tst.b    watch_size
  3081.         beq.w    .nowatch
  3082.  
  3083. ;-------------- init watch_orig ---------------
  3084.         lea.l    watch_size(pc),a0
  3085.         lea.l    watch_addr(pc),a1
  3086.         lea.l    watch_orig(pc),a2
  3087. .loop        tst.b    (a0)+
  3088.         beq.b    .end
  3089.         move.l    (a1)+,a3
  3090.         move.l    (a3),(a2)+
  3091.         bra.b    .loop
  3092. .end
  3093.         move.l    vbr_reg,a4
  3094.         or.w    #$8000,sr_reg
  3095.         move.l    $24(a4),old_trace
  3096.         move.l    #watch_entry,$24(a4)
  3097.  
  3098. .nowatch    movem.l    (a7)+,a0-a3
  3099.         rts
  3100.  
  3101. watch_entry    move.w    #$2700,sr
  3102.         movem.l    d0-d1/a0-a3,-(a7)
  3103.         lea.l    watch_size(pc),a0
  3104.         lea.l    watch_addr(pc),a1
  3105.         lea.l    watch_orig-4(pc),a2
  3106.         moveq    #0,d0
  3107. .loop        addq.l    #4,a2
  3108.         move.b    (a0)+,d0
  3109.         beq.b    .end
  3110.         move.l    (a1)+,a3
  3111.         subq.b    #1,d0
  3112.         bne.b    .nob
  3113.         move.b    (a3),d1
  3114.         cmp.b    (a2),d1
  3115.         beq.b    .loop
  3116.         bra.b    .diff
  3117. .nob        subq.b    #1,d0
  3118.         bne.b    .now
  3119.         move.w    (a3),d1
  3120.         cmp.w    (a2),d1
  3121.         beq.b    .loop
  3122.         bra.b    .diff
  3123. .now        move.l    (a3),d1
  3124.         cmp.l    (a2),d1
  3125.         beq.b    .loop
  3126.  
  3127. .diff        move.l    a3,watch_trigger
  3128.         move.l    vbr_reg,a0
  3129.         move.l    old_trace,$24(a0)
  3130.         movem.l    (a7)+,d0-d1/a0-a3
  3131.         and.w    #$7fff,(a7)
  3132.         st    watch_flag
  3133.         bra.w    monitor
  3134.  
  3135. .end        movem.l    (a7)+,d0-d1/a0-a3
  3136.         rte
  3137.  
  3138. ShowWatchEntry    movem.l    d0-d1/a0,-(a7)
  3139.         tst.b    watch_flag
  3140.         beq.b    .exit
  3141.         sf    watch_flag
  3142.         lea.l    .txt(pc),a0
  3143.         bsr    print
  3144.         move.l    watch_trigger(pc),d0
  3145.         moveq    #8,d1
  3146.         bsr    print_hexCR
  3147. .exit        movem.l    (a7)+,d0-d1/a0
  3148.         rts
  3149.  
  3150. .txt        dc.b "Watched memory changed at $",0
  3151.         even
  3152.  
  3153. ****************************************************************
  3154. ;-------------- delete all memory watch  -----------------------
  3155.  
  3156. cmd_mwd        lea.l    watch_size(pc),a0
  3157.         moveq    #MAX_WATCH-1,d0
  3158. .clear        clr.b    (a0)+
  3159.         dbf    d0,.clear
  3160.         lea.l    .txt(pc),a0
  3161.         bsr    print
  3162.         bra.w    end_command
  3163.  
  3164. .txt        dc.b "All memory watch deleted",$a,0
  3165.         even
  3166.  
  3167. ****************************************************************
  3168. ;-------------- FS find string (not casesensitive) -------------
  3169.  
  3170. cmd_fs        bsr    evaluate
  3171.         bne.w    illegal_addr
  3172.         move.l    d0,find_start
  3173.         bsr    evaluate
  3174.         bne.w    illegal_addr
  3175.         move.l    d0,find_end
  3176.         movem.l    find_start,d0-d1
  3177.         cmp.l    d0,d1
  3178.         ble.w    illegal_addr
  3179.  
  3180.         lea.l    find_list,a1
  3181.         bsr    read_name
  3182.         tst.b    (a1)
  3183.         beq.w    illegal_string
  3184.  
  3185. .up        move.b    (a1),d0
  3186.         beq.b    .endlist
  3187.         bsr    upper_case
  3188.         move.b    d0,(a1)+
  3189.         bra.b    .up
  3190. .endlist
  3191.         movem.l    find_start,a0-a1
  3192.  
  3193.         lea.l    watch,a3
  3194.         move.l    a0,(a3)
  3195.  
  3196. .seek        tst.b    break
  3197.         bne.w    .endfs
  3198.         lea.l    find_list,a2
  3199.         move.b    (a2)+,d1
  3200. .next        cmp.l    a1,a0
  3201.         bge.w    .endfs
  3202.         move.l    a0,(a3)
  3203.         move.l    a0,a4
  3204.         RELOC_PIC 1
  3205.         move.b    (a4),d0
  3206.         addq.l    #1,a0
  3207.         bsr    upper_case
  3208.         cmp.b    d0,d1
  3209.         bne.w    .next
  3210.  
  3211.         move.l    a0,d7
  3212. .ok        move.b    (a2)+,d1
  3213.         beq.w    .found
  3214.         cmp.l    a1,a0
  3215.         bge.w    .endfs
  3216.         move.l    a0,a4
  3217.         RELOC_PIC 2
  3218.         addq.l    #1,a0
  3219.         move.b    (a4),d0
  3220.         bsr    upper_case
  3221.         cmp.b    d0,d1
  3222.         beq.w    .ok
  3223.         move.l    d7,a0
  3224.         bra.w    .seek
  3225.  
  3226. .found        move.l    d7,d0
  3227.         subq.l    #1,d0
  3228.         lea.l    ev_line,a0
  3229.         move.w    #$2020,8(a0)
  3230.         clr.b    10(a0)
  3231.         moveq    #8,d1
  3232.         bsr    conv_hex
  3233.         bsr    print
  3234.         move.l    d7,a0
  3235.         bra.w    .seek
  3236.  
  3237. .endfs
  3238.         tst.w    cursor_x
  3239.         beq.b    .no_CR
  3240.         lea.l    cr_txt,a0
  3241.         bsr    print
  3242. .no_CR
  3243.         bra.w    end_command
  3244.  
  3245. ****************************************************************
  3246.  
  3247. cmd_clear
  3248.         lea.l    sureclear_txt(pc),a0
  3249.         bsr    print
  3250.         bsr    get_key
  3251.         lea.l    sure2_txt(pc),a0
  3252.         bsr    print
  3253.         cmp.b    #'y',d0
  3254.         bne.b    .no
  3255.         bsr    remove_pic
  3256.         lea.l    $0.w,a0
  3257.         moveq    #0,d0
  3258.         moveq    #-1,d1
  3259. .clear        rept 8
  3260.         move.l    d0,(a0)+
  3261.         endr
  3262.         dbf    d1,.clear
  3263.         bsr    set_pic
  3264.         move.l    $f80004,a0
  3265.         subq.l    #2,a0
  3266.         move.l    a0,pc_reg
  3267.         move.w    #$2700,sr_reg
  3268.         st    escape
  3269.  
  3270. .no        bra.w    end_command
  3271.  
  3272. sureclear_txt    dc.b "All memory will be cleared and the machine will reboot!",$a
  3273.         dc.b "(You will have to reinstall HRTmon)",$a
  3274.         dc.b "Are you sure you want to continue ? (y/n)",$d,0
  3275. sure2_txt    dc.b "                                         ",$d,0
  3276.         even
  3277.  
  3278. ****************************************************************
  3279. ;-------------- SETMAP change keymap ----------------------
  3280.  
  3281. cmd_setmap    lea.l    ev_line,a1
  3282.         bsr    read_name
  3283.         tst.b    (a1)            ;keymap name given ?
  3284.         beq.w    .noset
  3285.  
  3286.         lea.l    ev_line,a0
  3287. .up        move.b    (a0),d0
  3288.         bsr    upper_case
  3289.         move.b    d0,(a0)+        ;upper-case keymap name
  3290.         tst.b    (a0)
  3291.         bne.b    .up
  3292.  
  3293.         lea.l    ev_line,a0
  3294.         cmp.l    #"USA"*256,(a0)
  3295.         bne.b    .noUSAset
  3296.         move.l    #board3,d0
  3297.         move.l    #board4,d1
  3298.         move.l    #board4a,d2
  3299.         bra.b    .set
  3300. .noUSAset    cmp.w    #"CH",(a0)
  3301.         bne.b    .noCHset
  3302.         tst.b    2(a0)
  3303.         bne.b    .noCHset
  3304.         move.l    #board1,d0
  3305.         move.l    #board2,d1
  3306.         move.l    #board2a,d2
  3307.         bra.b    .set
  3308. .noCHset    cmp.w    #"D"*256,(a0)
  3309.         bne.b    .noDset
  3310.         move.l    #board5,d0
  3311.         move.l    #board6,d1
  3312.         move.l    #board6a,d2
  3313.         bra.b    .set
  3314. .noDset        cmp.w    #"F"*256,(a0)
  3315.         bne.b    .noFset
  3316.         move.l    #board7,d0
  3317.         move.l    #board8,d1
  3318.         move.l    #board8a,d2
  3319.         bra.b    .set
  3320. .noFset
  3321.         lea.l    .maperr_txt(pc),a0
  3322.         bsr    print
  3323.         bra.b    .noset
  3324.  
  3325. .set        movem.l    d0-d2,board_ptr
  3326.  
  3327. .noset        lea.l    .key1_txt(pc),a0
  3328.         bsr    print
  3329.  
  3330.         move.l    board_ptr,d0
  3331.         cmp.l    #board3,d0
  3332.         bne.b    .noUSA
  3333.         lea.l    .key2_txt(pc),a0
  3334. .noUSA        cmp.l    #board1,d0
  3335.         bne.b    .noCH
  3336.         lea.l    .key3_txt(pc),a0
  3337. .noCH        cmp.l    #board5,d0
  3338.         bne.b    .noD
  3339.         lea.l    .key4_txt(pc),a0
  3340. .noD        cmp.l    #board7,d0
  3341.         bne.b    .noF
  3342.         lea.l    .key5_txt(pc),a0
  3343. .noF        bsr    print
  3344.  
  3345.         bra.w    end_command
  3346.  
  3347. .maperr_txt    dc.b "Illegal keymap name !",$a,0
  3348. .key1_txt    dc.b "Actual keymap is : ",0
  3349. .key2_txt    dc.b "USA",$a,0
  3350. .key3_txt    dc.b "CH",$a,0
  3351. .key4_txt    dc.b "D",$a,0
  3352. .key5_txt    dc.b "F",$a,0
  3353.         even
  3354.  
  3355. ;-------------- print exception vectors and names --------------
  3356.  
  3357. cmd_excep    moveq    #0,d2            ;first vector
  3358.         sub.l    a2,a2            ;first vector
  3359.         move.w    window_bot,d4
  3360.         sub.w    window_top,d4
  3361.         move.w    d4,d5
  3362. .loop        tst.b    break
  3363.         bne    .exit
  3364.         move.l    d2,d0
  3365.         lea    _exceptionnames,a0
  3366.         jsr    _DoStringNull
  3367.         move.l    d0,d3
  3368.         beq    .next
  3369.  
  3370.         lea    .t1,a0
  3371.         bsr    print
  3372.         move.l    (a2),d0
  3373.         moveq    #8,d1
  3374.         bsr    print_hex
  3375.         lea    .t2,a0
  3376.         bsr    print
  3377.         move.l    a2,d0
  3378.         moveq    #2,d1
  3379.         bsr    print_hex
  3380.         lea    .t3,a0
  3381.         bsr    print
  3382.         move.l    d3,a0
  3383.         bsr    print
  3384.         jsr    _PrintLn
  3385.  
  3386.         subq.w    #1,d4
  3387.         bne    .next
  3388.         move.w    d5,d4
  3389.         bsr    get_key
  3390.  
  3391. .next        addq.w    #1,d2
  3392.         addq.l    #4,a2
  3393.         cmp.w    #64,d2
  3394.         bne    .loop
  3395.  
  3396. .exit        bra.w    end_command
  3397.  
  3398. .t2        dc.b    " : "
  3399. .t1        dc.b    "$",0
  3400. .t3        dc.b    " ",0
  3401.         even
  3402.  
  3403. ;-------------- disk to file -----------------------------------
  3404. ;-------------- read a whole disk and save it as a file --------
  3405.  
  3406. cmd_d2f
  3407.         lea.l    ev_line,a1
  3408.         bsr    read_name
  3409.         tst.b    (a1)
  3410.         beq.w    illegal_name
  3411.  
  3412.         bsr    test_present
  3413.         bne.w    .error
  3414.  
  3415.         move.l    #ev_line,d1
  3416.         moveq    #-1,d2        ;create new file
  3417.         bsr    open_file
  3418.         move.l    d0,d7
  3419.         beq.b    .error
  3420.  
  3421.         move.w    #-1,ts_size        ;trainer buffer cleared
  3422.  
  3423.         moveq    #0,d5
  3424.         move.w    #160-1,d6
  3425. .next        move.l    #tmp_mem,a0
  3426.         move.l    d5,d0
  3427.         moveq    #11,d1
  3428.         bsr    read2
  3429.         bne.b    .error
  3430.         add.l    d1,d5
  3431.         move.l    d7,d1
  3432.         move.l    #tmp_mem,d2
  3433.         move.l    #512*11,d3
  3434.         bsr    write_file
  3435.         bne.b    .error
  3436.         tst.b    break
  3437.         bne.b    .close
  3438.         dbf    d6,.next
  3439.  
  3440. .close        move.l    d7,d1
  3441.         bsr    close_file
  3442. .error
  3443.  
  3444.         bra.w    end_command
  3445.  
  3446.  
  3447. ;-------------- file to disk -----------------------------------
  3448. ;-------------- read a file and write it to disk ---------------
  3449.  
  3450. cmd_f2d        lea.l    ev_line,a1
  3451.         bsr    read_name
  3452.         tst.b    (a1)
  3453.         beq.w    illegal_name
  3454.  
  3455.         bsr    test_present
  3456.         bne.w    .error
  3457.  
  3458.         move.l    #ev_line,d1
  3459.         moveq    #0,d2        ;open old file
  3460.         bsr    open_file
  3461.         move.l    d0,d7
  3462.         beq.w    .error
  3463.         move.l    d7,a0
  3464.         cmp.l    #80*22*512,file_size(a0)
  3465.         beq.b    .oksize
  3466.         lea.l    sizeErr_txt(pc),a0
  3467.         bsr    print
  3468.         bra.b    .error
  3469.  
  3470. .oksize
  3471.  
  3472.         move.w    #-1,ts_size        ;trainer buffer cleared
  3473.  
  3474.         moveq    #0,d5
  3475.         move.w    #160-1,d6
  3476. .next        move.l    d7,d1
  3477.         move.l    #tmp_mem,d2
  3478.         move.l    #512*11,d3
  3479.         bsr    read_file
  3480.         bne.b    .error
  3481.         move.l    #tmp_mem,a0
  3482.         move.l    d5,d0
  3483.         moveq    #11,d1
  3484.         bsr    write2
  3485.         bne.b    .error
  3486.         add.l    d1,d5
  3487.         tst.b    break
  3488.         bne.b    .close
  3489.         dbf    d6,.next
  3490.  
  3491. .close        move.l    d7,d1
  3492.         bsr    close_file
  3493. .error
  3494.  
  3495.         bra.w    end_command
  3496.  
  3497. sizeErr_txt    dc.b "Wrong file size !",$a,0
  3498.         even
  3499.  
  3500. ;-------------- show custom registers --------------------------
  3501.  
  3502. cmd_e        bsr    evaluate
  3503.         bne.b    .no_offset
  3504.         cmp.l    #$200,d0
  3505.         bge.w    illegal_addr
  3506.         btst    #0,d0
  3507.         bne.w    illegal_addr
  3508.         move.l    d0,custom_offset
  3509.         move.l    d0,d3
  3510.         bsr    evaluate        ;edit ?
  3511.         bne.b    .no_offset
  3512.         lea.l    custom,a3
  3513.         move.w    d0,(a3,d3.l)
  3514.         bra.w    end_command
  3515.  
  3516. .no_offset    move.l    custom_offset,d5
  3517.         moveq    #8-1,d7            ;print 8 lines
  3518. .loop        cmp.l    #$200,d5
  3519.         bge.b    .noprint
  3520.  
  3521.         bsr    make_e_line
  3522.  
  3523.         addq.l    #2,d5
  3524.         lea.l    general_txt,a0
  3525.         bsr    print
  3526.         dbf    d7,.loop
  3527.  
  3528. .noprint    move.l    d5,custom_offset
  3529.  
  3530.         bra.w    end_command
  3531.  
  3532. ;-> d5=offset
  3533. ;<- general_txt filled with e_line
  3534. make_e_line    movem.l    d0-a4,-(a7)
  3535.         lea.l    custom_names,a2
  3536.         lea.l    custom,a3
  3537.         lea.l    general_txt,a0
  3538.         move.w    #"e ",(a0)+
  3539.         move.b    #"$",(a0)+
  3540.         moveq    #3,d1
  3541.         move.w    d5,d0
  3542.         bsr    conv_hex        ;print offset
  3543.         add.l    d1,a0
  3544.         move.w    #" $",(a0)+
  3545.         move.w    (a3,d5.w),d0
  3546.         moveq    #4,d1
  3547.         bsr    conv_hex        ;print register value
  3548.         add.l    d1,a0
  3549.         move.l    #"  ; ",(a0)+
  3550.         lsl.w    #2,d5
  3551.         lea.l    (a2,d5.w),a4
  3552.         move.l    (a4)+,(a0)+
  3553.         move.l    (a4)+,(a0)+
  3554.         move.w    #$0a00,(a0)+
  3555.         movem.l    (a7)+,d0-a4
  3556.         rts
  3557.  
  3558. ;-------------- scroll up e_line -----------
  3559.  
  3560. cmdu_e        move.l    ascII_ptr,a0
  3561.         lea.l    80(a0),a0
  3562.         cmp.w    #'e ',(a0)    ;last top line was an e_line ?
  3563.         bne.b    .noe
  3564.         addq.l    #2,a0
  3565.         bsr    evaluate    ;get last offset
  3566.         subq.l    #2,d0
  3567.         bmi.b    .noe
  3568.  
  3569.         move.l    d0,d5
  3570.         bsr.b    make_e_line
  3571.  
  3572.         lea.l    general_txt,a0
  3573.         bsr    print
  3574.         subq.w    #1,(2,a3)    ;cursor one line up
  3575.  
  3576.         moveq    #0,d0
  3577.  
  3578. .noe        rts
  3579.  
  3580. ;-------------- scroll down e_line ---------
  3581.  
  3582. cmdd_e        move.l    ascII_ptr,a0
  3583.         move.l    d0,-(a7)
  3584.         move.w    window_bot,d0
  3585.         subq.w    #2,d0
  3586.         mulu    #80,d0
  3587.         add.l    d0,a0
  3588.         move.l    (a7)+,d0
  3589.         cmp.w    #'e ',(a0)    ;last line was an e_line ?
  3590.         bne.b    .noe
  3591.         addq.l    #2,a0
  3592.         bsr    evaluate    ;get last address
  3593.         addq.l    #2,d0
  3594.         cmp.l    #$200,d0
  3595.         bge.b    .noe
  3596.  
  3597.         move.l    d0,d5
  3598.         bsr    make_e_line
  3599.  
  3600.         addq.l    #2,d5
  3601.         move.l    d5,custom_offset
  3602.  
  3603.         subq.w    #1,(2,a3)        ;cursor one line up
  3604.         lea.l    general_txt,a0
  3605.         bsr    print
  3606.  
  3607.         moveq    #0,d0
  3608.  
  3609. .noe        rts
  3610.  
  3611.  
  3612. ;-------------- delete a file or an empty dir ------------------
  3613.  
  3614. cmd_del        lea.l    ev_line,a1
  3615.         bsr    read_name        ;get source name
  3616.         tst.b    (a1)
  3617.         beq.w    illegal_name
  3618.  
  3619.         move.l    #ev_line,d1
  3620.         bsr    delete_file
  3621.  
  3622.         bra.w    end_command
  3623.  
  3624. ;-------------- get partition info -----------------------------
  3625.  
  3626. cmd_part
  3627.  
  3628.         move.l    #floppy0,d0
  3629.  
  3630.         lea.l    part_txt(pc),a0
  3631.         bsr    print
  3632.  
  3633. .next        move.l    d0,a4
  3634.  
  3635.  
  3636.         lea.l    part_name(a4),a0
  3637.         lea.l    general_txt,a1
  3638.         move.l    a1,a2
  3639.         moveq    #8-1,d0
  3640. .fill        move.l    #"    ",(a2)+
  3641.         dbf    d0,.fill
  3642.  
  3643.         moveq    #0,d0
  3644.         move.b    (a0)+,d0
  3645.         bra.b    .godbf
  3646. .copy        move.b    (a0)+,(a1)+        ;copy name
  3647. .godbf        dbf    d0,.copy
  3648.         lea.l    part2_txt(pc),a0
  3649.         bsr    print
  3650.         lea.l    general_txt,a0
  3651.         sf    16(a0)
  3652.         bsr    print            ;print name
  3653.  
  3654.         lea.l    part3_txt(pc),a0
  3655.         cmp.l    #ide_device,part_device(a4)
  3656.         beq.b    .ide
  3657.         lea.l    part4_txt(pc),a0
  3658. .ide        bsr    print            ;device
  3659.  
  3660.         move.l    part_first(a4),d0
  3661.         moveq    #8,d1
  3662.         bsr    print_dec
  3663.  
  3664.         lea.l    part5_txt(pc),a0
  3665.         bsr    print
  3666.  
  3667.         move.l    part_nbsec(a4),d0
  3668.         moveq    #8,d1
  3669.         bsr    print_decCR
  3670.  
  3671.         move.l    part_next(a4),d0
  3672.         bne.b    .next
  3673.  
  3674.         bra.w    end_command
  3675.  
  3676. part_txt
  3677.  dc.b "--- Name ----------- -- Device -- -- First Block ----- -- NbBlocks --------",$a,0
  3678.  
  3679. part2_txt    dc.b "     ",0
  3680. part5_txt    dcb.b 11,$20
  3681.         dc.b 0
  3682.  
  3683. part3_txt    dc.b "    IDE       ",0
  3684. part4_txt    dc.b "    Floppy    ",0
  3685.         even
  3686.  
  3687. ;-------------- get info from IDE drives -----------------------
  3688.  
  3689. cmd_ide        tst.b    config_IDE
  3690.         bne.b    .goide
  3691.         lea.l    .noide_txt(pc),a0
  3692.         bsr    print
  3693.         bra.w    end_command
  3694. .goide        tst.b    config_elsat
  3695.         beq.b    .nocd32
  3696.         lea.l    .cd32_txt(pc),a0
  3697.         bsr    print
  3698.         bra.b    .cont
  3699. .nocd32        tst.b    config_A1200
  3700.         beq.b    .go4000
  3701.         lea.l    .a1200_txt(pc),a0
  3702.         bsr    print
  3703.         bra.b    .cont
  3704. .go4000        lea.l    .a4000_txt(pc),a0
  3705.         bsr    print
  3706.  
  3707. .cont        lea.l    secbuf,a0
  3708.         tst.w    IDE_info0
  3709.         beq.b    .nodrive0
  3710.         moveq    #0,d1        ;drive no 0
  3711.         bsr    Read_ID
  3712.         bne.b    .nodrive0
  3713.         lea.l    ide1_txt(pc),a0
  3714.         bsr    print
  3715.         bsr    .print_info
  3716.         bra.b    .okdrive0
  3717. .nodrive0    lea.l    ide2_txt(pc),a0
  3718.         bsr    print
  3719.  
  3720. .okdrive0    lea.l    secbuf,a0
  3721.         tst.w    IDE_info1
  3722.         beq.b    .nodrive1
  3723.         moveq    #1,d1        ;drive no 1
  3724.         bsr    Read_ID
  3725.         bne.b    .nodrive1
  3726.         lea.l    ide3_txt(pc),a0
  3727.         bsr    print
  3728.         bsr    .print_info
  3729.         bra.b    .okdrive1
  3730. .nodrive1    lea.l    ide4_txt(pc),a0
  3731.         bsr    print
  3732.  
  3733. .okdrive1    moveq    #0,d0
  3734.         moveq    #0,d1
  3735.         tst.w    IDE_info0
  3736.         beq.b    .no0
  3737.         lea.l    secbuf,a0
  3738.         bsr    Read_Block
  3739. .no0
  3740.         bra.w    end_command
  3741.  
  3742. .noide_txt    dc.b "No IDE interface",$a,0
  3743. .cd32_txt    dc.b "ELSAT CD32 Pro Module IDE interface",$a,0
  3744. .a1200_txt    dc.b "Gayle A1200 IDE interface",$a,0
  3745. .a4000_txt    dc.b "Gayle A4000 IDE interface",$a,0
  3746.         even
  3747.  
  3748. .print_info    lea.l    secbuf,a4
  3749.         lea.l    ide5_txt(pc),a0
  3750.         bsr    print
  3751.         lea.l    27*2(a4),a0
  3752.         move.w    #$0a00,46*2(a4)
  3753.         tst.w    (a0)
  3754.         bne.b    .okname
  3755.         lea.l    ide10_txt(pc),a0
  3756. .okname        bsr    print            ;name
  3757.  
  3758.         lea.l    ide6_txt(pc),a0
  3759.         bsr    print
  3760.         lea.l    10*2(a4),a0
  3761.         move.w    #$0a00,19*2(a4)
  3762.         tst.w    (a0)
  3763.         bne.b    .okser
  3764.         lea.l    ide10_txt(pc),a0
  3765. .okser        cmp.b    #$20,(a0)+
  3766.         beq.b    .okser
  3767.         subq.l    #1,a0
  3768.         move.l    a0,a1
  3769. .seeke        tst.b    (a1)+
  3770.         bne.b    .seeke
  3771.         move.b    #$a,-2(a1)
  3772.         bsr    print            ;serial
  3773.  
  3774.         lea.l    ide7_txt(pc),a0
  3775.         bsr    print
  3776.         move.w    1*2(a4),d0
  3777.         moveq    #4,d1
  3778.         bsr    print_decCR        ;cylinders
  3779.  
  3780.         lea.l    ide8_txt(pc),a0
  3781.         bsr    print
  3782.         move.w    3*2(a4),d0
  3783.         moveq    #4,d1
  3784.         bsr    print_decCR        ;heads
  3785.  
  3786.         lea.l    ide9_txt(pc),a0
  3787.         bsr    print
  3788.         move.w    6*2(a4),d0
  3789.         moveq    #4,d1
  3790.         bsr    print_decCR        ;sectors
  3791.  
  3792.         lea.l    ide11_txt(pc),a0
  3793.         bsr    print
  3794.         moveq    #5,d1
  3795.         move.w    3*2(a4),d0
  3796.         mulu    6*2(a4),d0        ;sec*heads
  3797.         mulu    1*2(a4),d0        ;cyl*sec*heads
  3798.         moveq    #11,d1
  3799.         lsr.l    d1,d0
  3800.         moveq    #4,d1
  3801.         bsr    print_dec
  3802.         lea.l    ide12_txt(pc),a0
  3803.         bsr    print
  3804.  
  3805.         rts
  3806.  
  3807. ide1_txt    dc.b "-- Drive 0   : present",$a,0
  3808. ide2_txt    dc.b "-- Drive 0   : absent",$a,0
  3809. ide3_txt    dc.b "-- Drive 1   : present",$a,0
  3810. ide4_txt    dc.b "-- Drive 1   : absent",$a,0
  3811. ide5_txt    dc.b "   Name      : ",0
  3812. ide6_txt    dc.b "   Serial no : ",0
  3813. ide7_txt    dc.b "   Cylinders : ",0
  3814. ide8_txt    dc.b "   Heads     : ",0
  3815. ide9_txt    dc.b "   Sectors   : ",0
  3816. ide10_txt    dc.b "N/A",$a,0
  3817. ide11_txt    dc.b "   Capacity  : ",0
  3818. ide12_txt    dc.b "(MB)",$a,0
  3819.         even
  3820.  
  3821. ;-------------- COPY --------------------------------------
  3822.  
  3823. cmd_copy
  3824.         lea.l    ev_line,a1
  3825.         bsr    read_name        ;get source name
  3826.         tst.b    (a1)
  3827.         beq.w    illegal_name
  3828.         lea.l    general_txt,a1
  3829.         bsr    read_name        ;get dest name
  3830.         tst.b    (a1)
  3831.         beq.w    illegal_name
  3832.  
  3833.         bsr    remove_pic
  3834.  
  3835.         moveq    #0,d6
  3836.         moveq    #0,d7
  3837.         move.l    #ev_line,d1
  3838.         moveq    #0,d2
  3839.         bsr    open_file
  3840.         move.l    d0,d6
  3841.         beq.w    .err
  3842.         move.l    #general_txt,d1
  3843.         moveq    #-1,d2
  3844.         bsr    open_file
  3845.         move.l    d0,d7
  3846.         bne.b    .okdest
  3847.  
  3848.         cmp.w    #FILEEXIST_ERR,drive_err
  3849.         bne.w    .err        ;got only path without filename ?
  3850.         clr.w    drive_err
  3851.         lea.l    general_txt,a0
  3852. .seek        tst.b    (a0)+
  3853.         bne.b    .seek
  3854.         subq.l    #1,a0
  3855.         cmp.b    #':',-1(a0)
  3856.         beq.b    .noslash
  3857.         move.b    #'/',(a0)+
  3858. .noslash    move.l    d6,a1
  3859.         lea.l    file_name(a1),a1
  3860.         moveq    #0,d0
  3861.         move.b    (a1)+,d0
  3862.         bra.b    .godbf
  3863. .addname    move.b    (a1)+,(a0)+    ;add filename to dest
  3864. .godbf        dbf    d0,.addname
  3865.         sf    (a0)
  3866.  
  3867.         move.l    #general_txt,d1
  3868.         moveq    #-1,d2
  3869.         bsr    open_file    ;retry with filename
  3870.         move.l    d0,d7
  3871.         beq.b    .err
  3872. .okdest
  3873.  
  3874.         move.l    d6,a0
  3875.         move.l    file_size(a0),d5
  3876.         beq.b    .err
  3877.  
  3878.         move.w    #-1,ts_size        ;trainer buffer cleared
  3879.  
  3880. .nextblock    move.l    #tmp_mem_size,d3
  3881.         cmp.l    d3,d5
  3882.         bge.b    .okd5
  3883.         move.l    d5,d3
  3884. .okd5        sub.l    d3,d5
  3885.  
  3886.         move.l    d6,d1
  3887.         move.l    #tmp_mem,d2
  3888.         bsr    read_file
  3889.         tst.l    d0
  3890.         bne.b    .err
  3891.  
  3892.         move.l    d7,d1
  3893.         bsr    write_file
  3894.         tst.l    d0
  3895.         bne.b    .err
  3896.  
  3897.         tst.l    d5
  3898.         bne.b    .nextblock
  3899.  
  3900. .err        move.l    d6,d1
  3901.         beq.b    .noclose1
  3902.         bsr    close_file
  3903. .noclose1    move.l    d7,d1
  3904.         beq.b    .noclose2
  3905.         bsr    close_file
  3906. .noclose2
  3907.         bsr    set_pic
  3908.  
  3909.         bra.w    end_command
  3910.  
  3911. ;-------------- OUTPUT ------------------------------------
  3912.  
  3913. cmd_output    bsr    evaluate
  3914.         bne.b    .end
  3915.         tst.l    d0
  3916.         beq.b    .end
  3917.         move.l    d0,output_ptr
  3918.         move.l    d0,output_start
  3919. ;        move.l    d0,watch2
  3920.  
  3921.         bra.b    .out
  3922.  
  3923. .end        move.l    output_ptr,d2
  3924.         move.l    output_start,d0
  3925.         clr.l    output_ptr
  3926.         clr.l    output_start
  3927.  
  3928.         lea.l    endout_txt,a0
  3929.         bsr    print
  3930.         moveq    #8,d1
  3931.         bsr    print_hex        ;output_start
  3932.         lea.l    endout2_txt,a0
  3933.         bsr    print
  3934.         move.l    d2,d0            ;output_ptr
  3935.         bsr    print_hexCR
  3936.  
  3937. .out        bra.w    end_command
  3938.  
  3939. endout_txt    dc.b "Output memory from $",0
  3940. endout2_txt    dc.b " to $",0
  3941.         cnop 0,4
  3942.  
  3943. ;-------------- Q (compare memory) ------------------------
  3944.  
  3945. cmd_q        bsr    evaluate
  3946.         bne.w    illegal_addr
  3947.         move.l    d0,cmp_start
  3948.         bsr    evaluate
  3949.         bne.w    illegal_addr
  3950.         move.l    d0,cmp_end
  3951.         sub.l    cmp_start,d0
  3952.         ble.w    illegal_addr
  3953.         bsr    evaluate
  3954.         bne.w    illegal_addr
  3955.         move.l    d0,cmp_dest
  3956.  
  3957.         bsr    remove_pic
  3958.         moveq    #0,d0
  3959.         move.l    d0,$180(a6)
  3960.  
  3961.         move.l    cmp_start,a0
  3962.         move.l    cmp_dest,a1
  3963.         move.l    cmp_end,a2
  3964.         moveq    #-1,d0
  3965.  
  3966. .ok        cmp.l    a2,a0
  3967.         bge.b    .end_cmp
  3968.         cmpm.b    (a0)+,(a1)+
  3969.         beq.b    .ok
  3970.         move.l    a0,d0
  3971.         subq.l    #1,d0
  3972. .end_cmp
  3973.         bsr    set_pic
  3974.  
  3975.         moveq    #-1,d1
  3976.         cmp.l    d1,d0
  3977.         beq.b    .equal
  3978.  
  3979.         moveq    #8,d1
  3980.         bsr    print_hexCR
  3981.         bra.b    .out
  3982. .equal
  3983.         lea.l    equal_txt,a0
  3984.         bsr    print
  3985. .out
  3986.         bra.w    end_command
  3987.  
  3988. equal_txt    dc.b "Equal areas.",$a,0
  3989.         even
  3990.  
  3991. ;-------------- A -----------------------------------------
  3992.  
  3993. cmd_a        move.l    a0,a3
  3994.         bsr    evaluate
  3995.         bne.b    .godisas
  3996.         btst    #0,d0
  3997.         bne.w    illegal_addr
  3998.         move.l    d0,a1
  3999.         move.l    a1,ass_addr
  4000. .skip        cmp.b    #$20,(a0)+
  4001.         beq.b    .skip
  4002.         subq.l    #1,a0
  4003.         tst.b    (a0)
  4004.         bne.b    .goas
  4005. .godisas    move.l    a3,a0
  4006.         bra.w    cmd_d
  4007.  
  4008. .goas        jsr    assemble
  4009.         tst.l    d0
  4010.         bne.w    illegal_syntax
  4011.  
  4012. .ok        lea.l    op68000,a0
  4013.         move.l    ass_addr,a4
  4014.         bsr    reloc_pic
  4015.         move.w    oplen,d0
  4016. .copy        move.w    (a0)+,(a4)+
  4017.         dbf    d0,.copy
  4018.  
  4019.         moveq    #8,d1
  4020.         move.l    ass_addr,d0
  4021.         moveq    #0,d2
  4022.         move.w    oplen,d2
  4023.         add.w    d2,d2
  4024.         addq.l    #2,d2
  4025.         add.l    d2,d0
  4026.  
  4027.         lea.l    new_ass(pc),a0
  4028.         bsr    print
  4029.         bsr    print_hex
  4030.         lea.l    new_ass2(pc),a0
  4031.         bsr    print
  4032.         bra.w    end_command
  4033.  
  4034. new_ass        dc.b "a $",0
  4035. new_ass2    dc.b " ",0
  4036.         cnop 0,4
  4037.  
  4038. ;-------------- O -----------------------------------------
  4039. ;fill memory
  4040. cmd_o        bsr    evaluate
  4041.         bne.w    illegal_addr
  4042.         move.l    d0,fill_start
  4043.         move.l    d0,d1
  4044.         bsr    evaluate
  4045.         bne.w    illegal_addr
  4046.         move.l    d0,fill_end
  4047.         sub.l    d1,d0
  4048.         ble.w    illegal_addr
  4049.  
  4050.         clr.w    eval_size        ;.b par default
  4051.         bsr    evaluate
  4052.  
  4053.         bsr    remove_pic
  4054.         movem.l    fill_start,a0-a1
  4055.         move.w    eval_size,d1
  4056.         cmp.w    #3,d1
  4057.         beq.b    .fillL
  4058.         cmp.w    #1,d1
  4059.         beq.b    .fillW
  4060. .fillb        move.b    d0,(a0)+
  4061.         cmp.l    a1,a0
  4062.         blt.b    .fillb
  4063.         bra.b    .out
  4064. .fillW        move.w    d0,(a0)+
  4065.         cmp.l    a1,a0
  4066.         blt.b    .fillW
  4067.         bra.b    .out
  4068. .fillL        move.l    d0,(a0)+
  4069.         cmp.l    a1,a0
  4070.         blt.b    .fillL
  4071.  
  4072.  
  4073. .out        bsr    set_pic
  4074.  
  4075.         bra.w    end_command
  4076.  
  4077. ;-------------- Switch led --------------------------------
  4078.  
  4079. cmd_led        bchg    #1,$bfe001
  4080.         bchg    #1,CIAA+0
  4081.         bra.w    end_command
  4082.  
  4083. ;-------------- PAL/NTSC ----------------------------------
  4084.  
  4085. cmd_pal        clr.l    OldRaster
  4086.         move.w    #$20,custom+$1dc
  4087.         bra.w    end_command
  4088. cmd_ntsc    clr.l    OldRaster
  4089.         move.w    #0,custom+$1dc
  4090.         bra.w    end_command
  4091.  
  4092. cmd_31k        clr.l    OldRaster
  4093.         move.w    #$3a0,custom+$1dc
  4094.         bra.w    end_command
  4095.  
  4096. ;-------------- S (SAVEFILE) ------------------------------
  4097.  
  4098. cmd_s
  4099.         lea.l    ev_line,a1
  4100.         bsr.w    read_name
  4101.         tst.b    (a1)
  4102.         beq.w    illegal_name
  4103.         bsr    evaluate
  4104.         bne.w    illegal_addr
  4105.         bne.w    illegal_addr
  4106.         move.l    d0,d4            ;d4=save start
  4107.         bsr    evaluate
  4108.         bne.w    illegal_addr
  4109.         bne.w    illegal_addr
  4110.         move.l    d0,d3            ;d3=save end
  4111.         move.l    d0,d1
  4112.         move.l    d4,d0
  4113.         sub.l    d4,d3            ;d3=save len
  4114.         ble.w    illegal_addr        ;end must be > start
  4115.  
  4116.         bsr    remove_pic
  4117.  
  4118.         move.l    #ev_line,d1        ;ptr on filename
  4119.         moveq    #-1,d2            ;mode create
  4120.         bsr    open_file
  4121.         move.l    d0,d7
  4122.         beq.b    .err
  4123.  
  4124.         move.l    d4,d2
  4125.         move.l    d7,d1
  4126.         bsr    write_file        ;save mem
  4127.  
  4128.         move.l    d7,d1
  4129.         bsr    close_file
  4130.  
  4131. .err        bsr    set_pic
  4132.  
  4133.         bra.w    end_command
  4134.  
  4135.  
  4136. ;-------------- MAKEDIR -----------------------------------
  4137.  
  4138. cmd_makedir    lea.l    ev_line,a1
  4139.         bsr.w    read_name
  4140.         tst.b    (a1)
  4141.         beq.w    illegal_name
  4142.  
  4143.         move.l    #ev_line,d1
  4144.         bsr    create_dir
  4145.  
  4146.         bra.w    end_command
  4147.  
  4148. ;-------------- SA ----------------------------------------
  4149. ;-------------- save the actual state in a file -----------
  4150.  
  4151. cmd_sa
  4152.         lea.l    ev_line,a1
  4153.         bsr.w    read_name
  4154.         tst.b    (a1)
  4155.         beq.w    illegal_name
  4156.  
  4157.         sub.l    a0,a0
  4158.         move.l    max_chip,a1
  4159.         bsr    search_cop
  4160.  
  4161.         move.w    drive,-(a7)
  4162.         moveq    #3,d4            ;first drive SEL (drive0)
  4163.         lea.l    drive_present,a3
  4164.         moveq    #4-1,d5            ;4 drives
  4165. .loopd        tst.b    (a3)+
  4166.         beq.b    .nodrive
  4167.         move.w    d4,drive        ;get
  4168.         bsr    inittete        ;floppy drive head pos
  4169. .nodrive    addq.w    #1,d4
  4170.         dbf    d5,.loopd
  4171.         move.w    (a7)+,drive
  4172.  
  4173.         bsr    remove_pic
  4174.  
  4175.         move.l    #ev_line,d1        ;ptr on filename
  4176.         moveq    #-1,d2            ;mode create
  4177.         bsr    open_file
  4178.         move.l    d0,d7
  4179.         beq.w    .err
  4180.  
  4181.         move.w    #-1,ts_size        ;trainer buffer cleared
  4182.  
  4183.         lea.l    tmp_mem,a4
  4184.         move.l    #"ARSV",(a4)
  4185.  
  4186.         move.l    d7,d1
  4187.         move.l    a4,d2
  4188.         moveq    #4,d3
  4189.         bsr    write_file        ;save header 'ARSV'
  4190.         bne.w    .err
  4191.  
  4192.         move.l    d7,d1
  4193.         move.l    #registres,d2
  4194.         move.l    #end_registres-registres,d3
  4195.         bsr    write_file        ;save registers
  4196.         bne.w    .err
  4197.  
  4198.         move.l    d7,d1
  4199.         move.l    #custom,d2
  4200.         move.l    #$200,d3
  4201.         bsr    write_file        ;save custom registers
  4202.         bne.w    .err
  4203.  
  4204.         move.l    d7,d1
  4205.         move.l    #palette,d2
  4206.         move.l    #256*4,d3
  4207.         bsr    write_file        ;save palette
  4208.         bne.w    .err
  4209.  
  4210.         move.l    d7,d1
  4211.         move.l    #CIAA,d2
  4212.         moveq    #32,d3
  4213.         bsr    write_file        ;save CIA registers
  4214.         bne.w    .err
  4215.  
  4216.         move.l    d7,d1
  4217.         move.l    #old_head,d2
  4218.         moveq    #4*2,d3
  4219.         bsr    write_file        ;write head pos of drives
  4220.         bne.w    .err
  4221.  
  4222.         move.l    d7,a0
  4223.         move.l    file_part(a0),a0
  4224.         cmp.l    #floppy_device,part_device(a0)
  4225.         bne.w    .goHD
  4226.  
  4227. ;-------------- floppy save routine ----------------
  4228.         move.l    d7,d1
  4229.         moveq    #0,d2
  4230.         move.l    #$CD000,d3
  4231.         bsr    write_file        ;write data on Disk1
  4232.         bne.w    .err
  4233.         move.l    d7,d1
  4234.         bsr    close_file
  4235.  
  4236.         bsr    flush_fbuffer
  4237.         bsr    force_change
  4238.  
  4239.         bsr    set_pic
  4240.         lea.l    disk2_txt(pc),a0
  4241.         bsr    print
  4242.         bsr    get_key
  4243.         lea.l    diskclr_txt(pc),a0
  4244.         bsr    print
  4245.         bsr    remove_pic
  4246.         tst.b    break
  4247.         bne.w    .err
  4248.  
  4249.         move.l    #ev_line,d1        ;ptr on filename
  4250.         moveq    #-1,d2            ;mode create
  4251.         bsr    open_file
  4252.         move.l    d0,d7
  4253.         beq.w    .err
  4254.  
  4255.         lea.l    tmp_mem,a4
  4256.         move.l    #"ARS2",(a4)
  4257.         move.l    d7,d1
  4258.         move.l    a4,d2
  4259.         moveq    #4,d3
  4260.         bsr    write_file
  4261.         bne.w    .err
  4262.  
  4263.         move.l    d7,d1
  4264.         move.l    #$CD000,d2
  4265.         move.l    d2,d3
  4266.         bsr    write_file        ;write data on Disk2
  4267.         bne.w    .err
  4268.         move.l    d7,d1
  4269.         bsr    close_file
  4270.  
  4271.         bsr    flush_fbuffer
  4272.         bsr    force_change
  4273.  
  4274.         bsr    set_pic
  4275.         lea.l    disk3_txt(pc),a0
  4276.         bsr    print
  4277.         bsr    get_key
  4278.         lea.l    diskclr_txt(pc),a0
  4279.         bsr    print
  4280.         bsr    remove_pic
  4281.         tst.b    break
  4282.         bne.b    .err
  4283.  
  4284.         move.l    #ev_line,d1        ;ptr on filename
  4285.         moveq    #-1,d2            ;mode create
  4286.         bsr    open_file
  4287.         move.l    d0,d7
  4288.         beq.b    .err
  4289.  
  4290.         lea.l    tmp_mem,a4
  4291.         move.l    #"ARS3",(a4)
  4292.         move.l    d7,d1
  4293.         move.l    a4,d2
  4294.         moveq    #4,d3
  4295.         bsr    write_file
  4296.         bne.b    .err
  4297.  
  4298.         move.l    d7,d1
  4299.         move.l    #$CD000*2,d2
  4300.         move.l    #$200000-$CD000*2,d3
  4301.         bsr    write_file        ;write data on Disk3
  4302.         bne.b    .err
  4303.         bra.b    .endsave
  4304.  
  4305. .goHD        move.l    d7,d1
  4306.         moveq    #0,d2
  4307.         move.l    #$200000,d3
  4308.         bsr    write_file        ;save all CHIPMEM
  4309.         bne.b    .err
  4310.  
  4311. .endsave    move.l    d7,d1
  4312.         bsr    close_file
  4313.  
  4314. .err        bsr    set_pic
  4315.  
  4316.         bra.w    end_command
  4317.  
  4318.  
  4319. disk1_txt    dc.b "Please insert disk 1 and press any key.",$d,0
  4320. disk2_txt    dc.b "Please insert disk 2 and press any key.",$d,0
  4321. disk3_txt    dc.b "Please insert disk 3 and press any key.",$d,0
  4322. diskclr_txt    dc.b "                                                   ",$d,0
  4323.         even
  4324.  
  4325.  
  4326. ;-------------- SAC ---------------------------------------
  4327. ;-------------- save the actual state in a file compressed
  4328.  
  4329. cmd_sac
  4330.         lea.l    ev_line,a1
  4331.         bsr.w    read_name
  4332.         tst.b    (a1)
  4333.         beq.w    illegal_name
  4334.  
  4335.         sub.l    a0,a0
  4336.         move.l    max_chip,a1
  4337.         bsr    search_cop
  4338.  
  4339.         move.w    drive,-(a7)
  4340.         moveq    #3,d4            ;first drive SEL (drive0)
  4341.         lea.l    drive_present,a3
  4342.         moveq    #4-1,d5            ;4 drives
  4343. .loopd        tst.b    (a3)+
  4344.         beq.b    .nodrive
  4345.         move.w    d4,drive        ;get
  4346.         bsr    inittete        ;floppy drive head pos
  4347. .nodrive    addq.w    #1,d4
  4348.         dbf    d5,.loopd
  4349.         move.w    (a7)+,drive
  4350.  
  4351.         bsr    remove_pic
  4352.  
  4353.         move.l    #ev_line,d1        ;ptr on filename
  4354.         moveq    #-1,d2            ;mode create
  4355.         bsr    open_file
  4356.         move.l    d0,d7
  4357.         beq.w    .err
  4358.  
  4359.         move.w    #-1,ts_size        ;trainer buffer cleared
  4360.  
  4361.         lea.l    tmp_mem,a4
  4362.         move.l    #"ARSC",(a4)
  4363.  
  4364.         move.l    d7,d1
  4365.         move.l    a4,d2
  4366.         moveq    #4,d3
  4367.         bsr    write_file        ;save header 'ARSC'
  4368.         bne.w    .err
  4369.  
  4370.         move.l    d7,d1
  4371.         move.l    #registres,d2
  4372.         move.l    #end_registres-registres,d3
  4373.         bsr    write_file        ;save registers
  4374.         bne.w    .err
  4375.  
  4376.         move.l    d7,d1
  4377.         move.l    #custom,d2
  4378.         move.l    #$200,d3
  4379.         bsr    write_file        ;save custom registers
  4380.         bne.w    .err
  4381.  
  4382.         move.l    d7,d1
  4383.         move.l    #palette,d2
  4384.         move.l    #256*4,d3
  4385.         bsr    write_file        ;save palette
  4386.         bne.w    .err
  4387.  
  4388.         move.l    d7,d1
  4389.         move.l    #CIAA,d2
  4390.         moveq    #32,d3
  4391.         bsr    write_file        ;save CIA registers
  4392.         bne.w    .err
  4393.  
  4394.         move.l    d7,d1
  4395.         move.l    #old_head,d2
  4396.         moveq    #4*2,d3
  4397.         bsr    write_file        ;write head pos of drives
  4398.         bne.w    .err
  4399.  
  4400.         move.l    d7,a0
  4401.         move.l    file_part(a0),a0
  4402.         cmp.l    #floppy_device,part_device(a0)
  4403.         bne.w    .goHD
  4404.  
  4405. ;-------------- floppy save routine ----------------
  4406.  
  4407.         move.l    d7,d1
  4408.         moveq    #0,d2
  4409.         move.l    #$4008,d3
  4410.         bsr    write_file        ;write low-mem
  4411.         bne.w    .err
  4412.  
  4413.         lea.l    $4008.w,a0
  4414.         sub.l    a1,a1
  4415.         move.l    #$200000-$4008,d0
  4416.         bsr    pack
  4417.         move.l    d0,d6            ;d6=packed size
  4418.  
  4419.         move.l    d6,d3
  4420.         move.l    #1730*512-$4008-$68e,d0    ;size left on disk
  4421.         cmp.l    d0,d3
  4422.         blt.b    .okd3
  4423.         move.l    d0,d3
  4424. .okd3        sub.l    d3,d6
  4425.         move.l    d7,d1
  4426.         moveq    #0,d2
  4427.         bsr    write_file        ;write data on 1st disk
  4428.         bne.w    .err
  4429.  
  4430.         move.l    d7,d1
  4431.         bsr    close_file
  4432.  
  4433.         tst.l    d6
  4434.         beq.w    .lowmem
  4435.  
  4436. ;----------
  4437.  
  4438.         bsr    flush_fbuffer
  4439.         bsr    force_change
  4440.  
  4441.         bsr    set_pic
  4442.         lea.l    disk2_txt(pc),a0
  4443.         bsr    print
  4444.         bsr    get_key
  4445.         lea.l    diskclr_txt(pc),a0
  4446.         bsr    print
  4447.         bsr    remove_pic
  4448.         tst.b    break
  4449.         bne.w    .err
  4450.  
  4451.         move.l    #ev_line,d1        ;ptr on filename
  4452.         moveq    #-1,d2            ;mode create
  4453.         bsr    open_file
  4454.         move.l    d0,d7
  4455.         beq.w    .err
  4456.  
  4457.         lea.l    tmp_mem,a4
  4458.         move.l    #"ARC2",(a4)
  4459.         move.l    d7,d1
  4460.         move.l    a4,d2
  4461.         moveq    #4,d3
  4462.         bsr    write_file
  4463.         bne.w    .err
  4464.  
  4465.         move.l    d6,d3
  4466.         move.l    #1730*512-4,d0
  4467.         cmp.l    d0,d3
  4468.         blt.b    .okd3b
  4469.         move.l    d0,d3
  4470. .okd3b        sub.l    d3,d6
  4471.         move.l    d7,d1
  4472.         move.l    #1730*512-$4008-$68e,d2    ;size saved on 1st disk
  4473.         bsr    write_file
  4474.         bne.w    .err
  4475.  
  4476.         move.l    d7,d1
  4477.         bsr    close_file
  4478.         tst.l    d6
  4479.         beq.w    .enddisk
  4480.  
  4481. ;----------
  4482.  
  4483.         bsr    flush_fbuffer
  4484.         bsr    force_change
  4485.  
  4486.         bsr    set_pic
  4487.         lea.l    disk3_txt(pc),a0
  4488.         bsr    print
  4489.         bsr    get_key
  4490.         lea.l    diskclr_txt(pc),a0
  4491.         bsr    print
  4492.         bsr    remove_pic
  4493.         tst.b    break
  4494.         bne.w    .err
  4495.  
  4496.         move.l    #ev_line,d1        ;ptr on filename
  4497.         moveq    #-1,d2            ;mode create
  4498.         bsr    open_file
  4499.         move.l    d0,d7
  4500.         beq.w    .err
  4501.  
  4502.         lea.l    tmp_mem,a4
  4503.         move.l    #"ARC3",(a4)
  4504.         move.l    d7,d1
  4505.         move.l    a4,d2
  4506.         moveq    #4,d3
  4507.         bsr    write_file
  4508.         bne.w    .err
  4509.  
  4510.         move.l    d6,d3
  4511.         move.l    d7,d1
  4512.         move.l    #(1730*512-$4008-$68e)+(1730*512-4),d2
  4513.                         ;size saved on disks 1&2
  4514.         bsr    write_file
  4515.         bne.w    .err
  4516.  
  4517. .retry        move.l    d7,d1
  4518.         bsr    close_file
  4519.  
  4520. .enddisk    bsr    flush_fbuffer
  4521.         bsr    force_change
  4522.         clr.w    drive_err
  4523.  
  4524.         bsr    set_pic
  4525.         lea.l    disk1_txt(pc),a0
  4526.         bsr    print
  4527.         bsr    get_key
  4528.         lea.l    diskclr_txt(pc),a0
  4529.         bsr    print
  4530.         bsr    remove_pic
  4531.         tst.b    break
  4532.         bne.w    .err
  4533.  
  4534. .lowmem        move.l    #ev_line,d1
  4535.         moveq    #0,d2
  4536.         bsr    open_file
  4537.         move.l    d0,d7
  4538.         beq.b    .enddisk
  4539.  
  4540.         lea.l    tmp_mem,a4
  4541.         move.l    a4,d2
  4542.         moveq    #4,d3
  4543.         move.l    d7,d1
  4544.         bsr    read_file
  4545.         bne.b    .retry
  4546.         cmp.l    #"ARSC",(a4)
  4547.         bne.b    .retry
  4548.  
  4549.         move.l    d7,d1
  4550.         move.l    #$68e,d2
  4551.         moveq    #-1,d3
  4552.         bsr    seek_file
  4553.  
  4554.         sub.l    a0,a0
  4555.         lea.l    $4008.w,a1
  4556.         bsr    depack
  4557.  
  4558.         move.l    d7,d1
  4559.         moveq    #0,d2
  4560.         move.l    #$4008,d3
  4561.         bsr    read_file
  4562.  
  4563.         bra.b    .endsave
  4564.  
  4565. ;-----------------------------------------------
  4566.  
  4567. .goHD        move.l    d7,d1
  4568.         moveq    #0,d2
  4569.         move.l    #$4008,d3
  4570.         bsr    write_file        ;save low-mem
  4571.         bne.b    .err
  4572.  
  4573.         lea.l    $4008.w,a0
  4574.         lea.l    $0.w,a1
  4575.         move.l    #$200000-$4008,d0
  4576.         bsr    pack
  4577.         move.l    d0,d3
  4578.         move.l    d0,d5            ;d5=packed size+header
  4579.         move.l    d7,d1
  4580.         moveq    #0,d2
  4581.         bsr    write_file        ;save packed mem
  4582.         bne.b    .err
  4583.  
  4584.         lea.l    $0.w,a0
  4585.         lea.l    $4008.w,a1
  4586.         bsr    depack
  4587.  
  4588.         move.l    d7,d1
  4589.         move.l    d5,d2
  4590.         add.l    #$4008,d2
  4591.         neg.l    d2
  4592.         moveq    #0,d3
  4593.         bsr    seek_file
  4594.  
  4595.         move.l    d7,d1
  4596.         moveq    #0,d2
  4597.         move.l    #$4008,d3
  4598.         bsr    read_file
  4599.  
  4600. .endsave    move.l    d7,d1
  4601.         bsr    close_file
  4602.  
  4603. .err        bsr    set_pic
  4604.  
  4605.         bra.w    end_command
  4606.  
  4607.  
  4608. ;-------------- LA ----------------------------------------
  4609. ;-------------- load a saved game -------------------------
  4610.  
  4611. cmd_la        lea.l    ev_line,a1
  4612.         bsr.w    read_name
  4613.         tst.b    (a1)
  4614.         beq.w    illegal_name
  4615.  
  4616.         bsr    remove_pic
  4617.  
  4618.         move.l    #ev_line,d1        ;ptr on filename
  4619.         moveq    #0,d2            ;mode oldfile
  4620.         bsr    open_file
  4621.         move.l    d0,d7
  4622.         beq.w    .err
  4623.  
  4624.         lea.l    tmp_mem,a4
  4625.  
  4626.         move.w    #-1,ts_size        ;trainer buffer cleared
  4627.  
  4628.         move.l    d7,d1
  4629.         move.l    a4,d2
  4630.         moveq    #4,d3
  4631.         bsr    read_file        ;read header 'ARSV'
  4632.         bne.w    .err
  4633.  
  4634.         sf    packed
  4635.         cmp.l    #'ARSV',(a4)
  4636.         beq.b    .okarsv
  4637.         st    packed
  4638.         cmp.l    #'ARSC',(a4)
  4639.         beq.b    .okarsv
  4640.         lea.l    noarsv_txt(pc),a0
  4641.         bsr    print
  4642.         bra.w    .close
  4643. .okarsv
  4644.         move.l    d7,d1
  4645.         move.l    #registres,d2
  4646.         move.l    #end_registres-registres,d3
  4647.         bsr    read_file        ;read registers
  4648.         bne.w    .err
  4649.  
  4650.         move.l    d7,d1
  4651.         move.l    #custom,d2
  4652.         move.l    #$200,d3
  4653.         bsr    read_file        ;read custom registers
  4654.         bne.w    .err
  4655.  
  4656.         lea.l    custom,a1
  4657.         lea.l    $dff000,a2
  4658.         lea.l    move_list2(pc),a0
  4659.         move.w    #$100-1,d0
  4660. .loop        tst.b    (a0)+
  4661.         beq.b    .nomove
  4662.         move.w    (a1),(a2)        ;reinit custom registers
  4663. .nomove        addq.l    #2,a1
  4664.         addq.l    #2,a2
  4665.         dbf    d0,.loop
  4666.         clr.w    $dff088
  4667.         move.w    #0,$dff106
  4668.         move.w    #0,$dff180
  4669.  
  4670.         move.l    d7,d1
  4671.         move.l    #palette,d2
  4672.         move.l    #256*4,d3
  4673.         bsr    read_file        ;read palette
  4674.         bne.w    .err
  4675.  
  4676.         move.l    d7,d1
  4677.         move.l    #CIAA,d2
  4678.         moveq    #32,d3
  4679.         bsr    read_file        ;read CIA registers
  4680.         bne.w    .err
  4681.  
  4682.         move.l    d7,d1
  4683.         move.l    a4,d2
  4684.         moveq    #8,d3
  4685.         bsr    read_file        ;read drive headpos
  4686.  
  4687.         lea.l    old_head,a1
  4688.         move.l    a4,a2
  4689.         move.w    drive,-(a7)
  4690.         moveq    #3,d4            ;first drive SEL (drive0)
  4691.         lea.l    drive_present,a3
  4692.         moveq    #4-1,d5            ;4 drives
  4693. .loopd        tst.b    (a3)+
  4694.         beq.b    .nodrive
  4695.         move.w    d4,drive        ;init
  4696.         bsr    inittete        ;floppy drive head pos
  4697.         move.w    (a2),(a1)        ;init old_head
  4698. .nodrive    addq.w    #1,d4
  4699.         addq.l    #2,a1
  4700.         addq.l    #2,a2
  4701.         dbf    d5,.loopd
  4702.         move.w    (a7)+,drive
  4703.  
  4704.         move.l    d7,a0
  4705.         move.l    file_part(a0),a0
  4706.         cmp.l    #floppy_device,part_device(a0)
  4707.         bne.w    .goHD
  4708.  
  4709. ;-------------- floppy load --------------------
  4710.  
  4711.         tst.b    packed
  4712.         beq.w    .nopackedf
  4713.  
  4714. ;-------------- packed floppy load ---------
  4715.  
  4716.         move.l    d7,d1
  4717.         move.l    #$4008,d2
  4718.         moveq    #0,d3
  4719.         bsr    seek_file        ;skip low-mem
  4720.  
  4721.         move.l    d7,d1
  4722.         moveq    #0,d2
  4723.         move.l    #1730*512-$68e-$4008,d3
  4724.         bsr    read_file        ;read 1st disk
  4725.  
  4726.         move.l    $0.w,d6
  4727.         bpl.b    .okposf
  4728.         neg.l    d6
  4729. .okposf        addq.l    #8,d6        ;d6=packed size
  4730.         move.l    d1,a0
  4731.         move.l    file_size(a0),d0
  4732.         sub.l    #$68e+$4008,d0
  4733.         move.l    d0,d5
  4734.         sub.l    d0,d6
  4735.         beq.w    .lowmem
  4736.  
  4737. .retry2c    move.l    d7,d1
  4738.         bsr    close_file
  4739.  
  4740. .retry2bc    bsr    set_pic
  4741.         lea.l    disk2_txt(pc),a0
  4742.         bsr    print
  4743.         bsr    get_key
  4744.         lea.l    diskclr_txt(pc),a0
  4745.         bsr    print
  4746.         bsr    remove_pic
  4747.         tst.b    break
  4748.         bne.w    .err
  4749.  
  4750.         clr.w    drive_err
  4751.         move.l    #ev_line,d1        ;ptr on filename
  4752.         moveq    #0,d2            ;mode oldfile
  4753.         bsr    open_file
  4754.         move.l    d0,d7
  4755.         beq.b    .retry2bc
  4756.  
  4757.         lea.l    tmp_mem,a4
  4758.         move.l    d7,d1
  4759.         move.l    a4,d2
  4760.         moveq    #4,d3
  4761.         bsr    read_file
  4762.         bne.b    .retry2c
  4763.         cmp.l    #"ARC2",(a4)
  4764.         bne.b    .retry2c
  4765.  
  4766.         move.l    d7,d1
  4767.         move.l    d5,d2
  4768.         move.l    #1730*512-4,d3
  4769.         bsr    read_file        ;read disk2
  4770.  
  4771.         move.l    d1,a0
  4772.         move.l    file_size(a0),d0
  4773.         subq.l    #4,d0
  4774.         sub.l    d0,d6
  4775.         beq.b    .enddisk
  4776.         add.l    d0,d5
  4777.  
  4778. .retry3c    move.l    d7,d1
  4779.         bsr    close_file
  4780.  
  4781. .retry3bc    bsr    set_pic
  4782.         lea.l    disk3_txt(pc),a0
  4783.         bsr    print
  4784.         bsr    get_key
  4785.         lea.l    diskclr_txt(pc),a0
  4786.         bsr    print
  4787.         bsr    remove_pic
  4788.         tst.b    break
  4789.         bne.w    .err
  4790.  
  4791.         clr.w    drive_err
  4792.         move.l    #ev_line,d1        ;ptr on filename
  4793.         moveq    #0,d2            ;mode oldfile
  4794.         bsr    open_file
  4795.         move.l    d0,d7
  4796.         beq.b    .retry3bc
  4797.  
  4798.         lea.l    tmp_mem,a4
  4799.         move.l    d7,d1
  4800.         move.l    a4,d2
  4801.         moveq    #4,d3
  4802.         bsr    read_file
  4803.         bne.b    .retry3c
  4804.         cmp.l    #"ARC3",(a4)
  4805.         bne.b    .retry3c
  4806.  
  4807.         move.l    d7,d1
  4808.         move.l    d5,d2
  4809.         move.l    #1730*512-4,d3
  4810.         bsr    read_file        ;read disk3
  4811.  
  4812. .enddisk
  4813.         move.l    d7,d1
  4814.         bsr    close_file
  4815.  
  4816.     ;ask disk1 and read low-mem
  4817.  
  4818. .retry1        bsr    set_pic
  4819.         lea.l    disk1_txt(pc),a0
  4820.         bsr    print
  4821.         bsr    get_key
  4822.         lea.l    diskclr_txt(pc),a0
  4823.         bsr    print
  4824.         bsr    remove_pic
  4825.         tst.b    break
  4826.         bne.w    .err
  4827.  
  4828.         clr.w    drive_err
  4829.         move.l    #ev_line,d1        ;ptr on filename
  4830.         moveq    #0,d2            ;mode oldfile
  4831.         bsr    open_file
  4832.         move.l    d0,d7
  4833.         beq.b    .retry1
  4834.  
  4835.         lea.l    tmp_mem,a4
  4836.         move.l    d7,d1
  4837.         move.l    a4,d2
  4838.         moveq    #4,d3
  4839.         bsr    read_file
  4840.         bne.b    .enddisk
  4841.         cmp.l    #"ARSC",(a4)
  4842.         bne.b    .enddisk
  4843.  
  4844. .lowmem        move.l    d7,d1
  4845.         move.l    #$68e,d2
  4846.         moveq    #-1,d3
  4847.         bsr    seek_file
  4848.  
  4849.         sub.l    a0,a0
  4850.         lea.l    $4008.w,a1
  4851.         bsr    depack
  4852.  
  4853.         move.l    d7,d1
  4854.         moveq    #0,d2
  4855.         move.l    #$4008,d3
  4856.         bsr    read_file        ;read low-mem
  4857.  
  4858.         bra.w    .close
  4859.  
  4860. ;-------------- non-packed floppy load -----
  4861.  
  4862. .nopackedf    move.l    d7,d1
  4863.         moveq    #0,d2
  4864.         move.l    #$CD000,d3
  4865.         bsr    read_file
  4866.         bne.w    .err
  4867.  
  4868. .retry2        move.l    d7,d1
  4869.         bsr    close_file
  4870.  
  4871. .retry2b    bsr    set_pic
  4872.         lea.l    disk2_txt(pc),a0
  4873.         bsr    print
  4874.         bsr    get_key
  4875.         lea.l    diskclr_txt(pc),a0
  4876.         bsr    print
  4877.         bsr    remove_pic
  4878.         tst.b    break
  4879.         bne.w    .err
  4880.  
  4881.         clr.w    drive_err
  4882.         move.l    #ev_line,d1        ;ptr on filename
  4883.         moveq    #0,d2            ;mode oldfile
  4884.         bsr    open_file
  4885.         move.l    d0,d7
  4886.         beq.b    .retry2b
  4887.  
  4888.         lea.l    tmp_mem,a4
  4889.         move.l    d7,d1
  4890.         move.l    a4,d2
  4891.         moveq    #4,d3
  4892.         bsr    read_file
  4893.         bne.b    .retry2
  4894.         cmp.l    #"ARS2",(a4)
  4895.         bne.b    .retry2
  4896.  
  4897.         move.l    d7,d1
  4898.         move.l    #$CD000,d2
  4899.         move.l    d2,d3
  4900.         bsr    read_file        ;read data from disk2
  4901.         bne.w    .err
  4902.  
  4903. .retry3        move.l    d7,d1
  4904.         bsr    close_file
  4905.  
  4906. .retry3b    bsr    set_pic
  4907.         lea.l    disk3_txt(pc),a0
  4908.         bsr    print
  4909.         bsr    get_key
  4910.         lea.l    diskclr_txt(pc),a0
  4911.         bsr    print
  4912.         bsr    remove_pic
  4913.         tst.b    break
  4914.         bne.w    .err
  4915.  
  4916.         clr.w    drive_err
  4917.         move.l    #ev_line,d1        ;ptr on filename
  4918.         moveq    #0,d2            ;mode oldfile
  4919.         bsr    open_file
  4920.         move.l    d0,d7
  4921.         beq.b    .retry3b
  4922.  
  4923.         lea.l    tmp_mem,a4
  4924.         move.l    d7,d1
  4925.         move.l    a4,d2
  4926.         moveq    #4,d3
  4927.         bsr    read_file
  4928.         bne.b    .retry3
  4929.         cmp.l    #"ARS3",(a4)
  4930.         bne.b    .retry3
  4931.  
  4932.         move.l    d7,d1
  4933.         move.l    #2*$CD000,d2
  4934.         move.l    #$200000-2*$CD000,d3
  4935.         bsr    read_file        ;read data from disk3
  4936.         bne.w    .err
  4937.         bra.w    .close
  4938.  
  4939. ;------------------------------------------------
  4940.  
  4941. .goHD        tst.b    packed
  4942.         beq.b    .nopacked
  4943.         move.l    d7,d1
  4944.         move.l    #$4008,d2
  4945.         moveq    #0,d3
  4946.         bsr    seek_file        ;skip low-mem
  4947.         move.l    d7,d1
  4948.         moveq    #0,d2
  4949.         moveq    #8,d3
  4950.         bsr    read_file        ;read pack header
  4951.         bne.b    .err
  4952.         move.l    $0.w,d3            ;get packed size
  4953.         bpl.b    .okpos
  4954.         neg.l    d3
  4955. .okpos        move.l    d7,d1
  4956.         moveq    #8,d2
  4957.         move.l    d3,d5
  4958.         bsr    read_file        ;read packed data
  4959.         lea.l    $0.w,a0
  4960.         lea.l    $4008.w,a1
  4961.         bsr    depack
  4962.  
  4963.         move.l    d7,d1
  4964.         move.l    d5,d2
  4965.         add.l    #$4008+8,d2
  4966.         neg.l    d2
  4967.         moveq    #0,d3
  4968.         bsr    seek_file
  4969.  
  4970.         move.l    d7,d1
  4971.         moveq    #0,d2
  4972.         move.l    #$4008,d3
  4973.         bsr    read_file        ;read low-mem area
  4974.  
  4975.         bra.b    .close
  4976.  
  4977. .nopacked    move.l    d7,d1
  4978.         moveq    #0,d2
  4979.         move.l    #$200000,d3
  4980.         bsr    read_file        ;read all CHIPMEM
  4981.         bne.b    .err
  4982.  
  4983. .close        move.l    d7,d1
  4984.         bsr    close_file
  4985.  
  4986. .err        bsr    set_pic
  4987.  
  4988.         bra.w    end_command
  4989.  
  4990. noarsv_txt    dc.b "Not a HRTmon save file !",$a,0
  4991.         even
  4992.  
  4993. ;-------------- list of registers to be initialised after la_cmd ----
  4994.  
  4995. move_list2    dcb.b $10,0        ;$00-$1e
  4996.         dc.b -1,-1,-1        ;$20-$24
  4997.         dc.b 0,0,0,0        ;$26-$2c
  4998.         dcb.b 5,-1        ;$2e-$36
  4999.         dcb.b 4,0        ;$38-$3e
  5000.         dcb.b $c,-1        ;$40-$56
  5001.         dc.b 0,0        ;$58,$5a
  5002.         dc.b 0,0        ;$5c,$5e
  5003.         dcb.b 4,-1        ;$60-$66
  5004.         dcb.b 4,0        ;$68-$6e
  5005.         dc.b -1,-1,-1        ;$70-$74
  5006.         dcb.b 4,0        ;$76-$7c
  5007.         dc.b -1            ;$7e
  5008.         dc.b -1,-1        ;$80,$82    ;cop1
  5009.         dc.b -1,-1        ;$84,$86    ;cop2
  5010.         dc.b 0,0,0        ;$88,$8a,$8c
  5011.         dc.b -1,-1,-1,-1    ;$8e,$90,$92,$94
  5012.         dc.b 0,-1,0,0        ;$96-$9c
  5013.         dcb.b $21,-1        ;$9e-$de
  5014.         dcb.b $10,-1        ;$e0-$fe
  5015.         dc.b 0,0,-1,0        ;$100-$106
  5016.         dc.b -1,-1,0        ;$108-$10c
  5017.         dc.b -1            ;$10e
  5018.         dcb.b 8,0        ;$110-$11e
  5019.         dcb.b $10,-1        ;$120-$13e
  5020.         dcb.b $20,0        ;$140-$17e
  5021.         dcb.b $20,0        ;$180-$1be
  5022.         dcb.b $d,-1        ;$1c0-$1d8
  5023.         dc.b 0            ;$1da
  5024.         dc.b 0            ;$1dc
  5025.         dc.b -1,-1,-1        ;$1de-$1e2
  5026.         dc.b 0            ;$1e4
  5027.         dcb.b 5,-1        ;$1e6-$1ee
  5028.         dcb.b 6,0        ;$1f0-$1fa
  5029.         dc.b 0            ;$1fc
  5030.         dc.b 0            ;$1fe
  5031.  
  5032. ;-------------- MOTOR -------------------------------------
  5033.  
  5034. cmd_motor    bsr    motor_on
  5035.         bra.w    end_command
  5036.  
  5037. ;----------------------------------------------------------
  5038.  
  5039. cmd_intel    lea.l    outside_txt(pc),a0
  5040.         bsr    print
  5041.  
  5042.         lea.l    cheat_cnt,a0
  5043.         tst.b    (a0)
  5044.         beq.b    .zero
  5045.         sf    (a0)
  5046.         bra.b    .out
  5047. .zero        addq.b    #1,(a0)
  5048. .out        bra.w    end_command
  5049.  
  5050. outside_txt    dc.b "OUTSIDE !",$a,0
  5051.         even
  5052.  
  5053. cmd_hornet    lea.l    hornet_txt(pc),a0
  5054.         bsr    print
  5055.  
  5056.         lea.l    cheat_cnt,a0
  5057.         cmp.b    #1,(a0)
  5058.         beq.b    .zero
  5059.         sf    (a0)
  5060.         bra.b    .out
  5061. .zero        addq.b    #1,(a0)
  5062. .out        bra.w    end_command
  5063.  
  5064.  
  5065. hornet_txt    dc.b "Illegal but nice command.",$a,0
  5066.         even
  5067.  
  5068. ;-------------- TSD deep trainer start --------------------
  5069.  
  5070. cmd_tsd        st    ts_deep
  5071.         bra.b    cmd_ts_go
  5072.  
  5073. ;-------------- TS trainer start --------------------------
  5074.  
  5075. cmd_ts        sf    ts_deep
  5076.  
  5077. cmd_ts_go    bsr    evaluate        ;get start address
  5078.         bne.w    illegal_addr
  5079.         move.l    d0,ts_start
  5080.         bsr    evaluate        ;get end address
  5081.         bne.w    illegal_addr
  5082.         move.l    d0,ts_end
  5083.         sub.l    ts_start,d0
  5084.         ble.w    illegal_addr
  5085.  
  5086.         movem.l    ts_start,d0-d1
  5087.         btst    #0,d0            ;even address ?
  5088.         bne.w    illegal_addr
  5089.         btst    #0,d1            ;even address ?
  5090.         bne.w    illegal_addr
  5091.  
  5092.         clr.w    eval_size        ;.b par default
  5093.         bsr    evaluate        ;get nb of lives in d0
  5094.         bne.w    illegal_val
  5095.          move.w    eval_size,ts_size    ;.b .w .l (0,1,2)
  5096.  
  5097.         lea.l    tmp_mem,a0
  5098.         bsr    live_scan
  5099.  
  5100.         bra.w    end_command
  5101.  
  5102. ;--------------------------------------
  5103. ;-> d0=nb of lives
  5104. ;-> a0=start of trainer buffer in 'tmp_mem'
  5105.  
  5106. live_scan    move.l    ts_end,d1
  5107.         cmp.l    ts_start,d1
  5108.         beq.w    .noscan
  5109.  
  5110.         move.l    d0,d3
  5111.         tst.b    ts_deep
  5112.         beq.b    .nodeep
  5113.         addq.l    #1,d0            ;d0=max val
  5114.         subq.l    #1,d3            ;d3=min val
  5115. .nodeep
  5116.  
  5117.         move.w    ts_size,d1        ;.b .w .l (0,1,2)
  5118.         beq.w    .go_b
  5119.         cmp.w    #1,d1
  5120.         bne.w    .go_l
  5121.         lea.l    tmp_mem+tmp_mem_size,a3
  5122.         subq.l    #4,a3            ;for end signal
  5123.         move.l    ts_start,a1
  5124.         move.l    ts_end,a2
  5125. .seek1        move.l    a1,a4
  5126.         move.l    a1,watch
  5127.         RELOC_PIC 1
  5128.         cmp.w    (a4),d3
  5129.         bgt.b    .no_eg1
  5130.         cmp.w    (a4),d0
  5131.         blt.b    .no_eg1
  5132.         move.l    a1,(a0)+
  5133.         cmp.l    a3,a0
  5134.         bge.w    .end_seek
  5135. .no_eg1        addq.l    #2,a1
  5136.         tst.b    break
  5137.         bne.w    .end_seek
  5138.         cmp.l    a2,a1
  5139.         blt.w    .seek1
  5140.         bra.w    .end_seek
  5141.  
  5142. .go_l        lea.l    tmp_mem+tmp_mem_size,a3
  5143.         subq.l    #4,a3            ;for end signal
  5144.         move.l    ts_start,a1
  5145.         move.l    ts_end,a2
  5146. .seek2        move.l    a1,a4
  5147.         move.l    a1,watch
  5148.         RELOC_PIC 2
  5149.         cmp.l    (a4),d3
  5150.         bgt.b    .no_eg2
  5151.         cmp.l    (a4),d0
  5152.         blt.b    .no_eg2
  5153.         move.l    a1,(a0)+
  5154.         cmp.l    a3,a0
  5155.         bge.w    .end_seek
  5156. .no_eg2        addq.l    #2,a1
  5157.         tst.b    break
  5158.         bne.w    .end_seek
  5159.         cmp.l    a2,a1
  5160.         blt.w    .seek2
  5161.         bra.w    .end_seek
  5162.  
  5163. .go_b        lea.l    tmp_mem+tmp_mem_size,a3
  5164.         subq.l    #4,a3            ;for end signal
  5165.         move.l    ts_start,a1
  5166.         move.l    ts_end,a2
  5167. .seek3        move.l    a1,a4
  5168.         move.l    a1,watch
  5169.         RELOC_PIC 3
  5170.         cmp.b    (a4),d3
  5171.         bgt.b    .no_eg3
  5172.         cmp.b    (a4),d0
  5173.         blt.b    .no_eg3
  5174.         move.l    a1,(a0)+
  5175.         cmp.l    a3,a0
  5176.         bge.b    .end_seek
  5177. .no_eg3        addq.l    #1,a1
  5178.         tst.b    break
  5179.         bne.b    .end_seek
  5180.         cmp.l    a2,a1
  5181.         blt.w    .seek3
  5182.  
  5183. .end_seek    move.l    #-1,(a0)        ;end signal
  5184.  
  5185.         moveq    #8,d1
  5186.  
  5187.         lea.l    ts_txt,a0
  5188.         bsr    print
  5189.         move.l    ts_start,d0
  5190.         bsr    print_hex
  5191.         lea.l    ts1_txt,a0
  5192.         bsr    print
  5193.         move.l    a1,d0
  5194.         move.l    a1,ts_start
  5195.         bsr    print_hexCR
  5196.  
  5197. .noscan        rts
  5198.  
  5199. ts_txt        dc.b "Scan range : $",0
  5200. ts1_txt        dc.b " - $",0
  5201.         even
  5202.  
  5203. ;-------------- TF trainer find ---------------------------
  5204.  
  5205. cmd_tf
  5206.         bsr    evaluate        ;read new nb of lives
  5207.         bne.w    illegal_val
  5208.         move.l    d0,d7            ;new nb of lives=d7
  5209.  
  5210.         move.l    d7,d3
  5211.         move.l    d7,d4
  5212.         tst.b    ts_deep
  5213.         beq.b    .nodeep
  5214.         addq.l    #1,d3            ;d3=max val
  5215.         subq.l    #1,d4            ;d4=min val
  5216.  
  5217. .nodeep        lea.l    tmp_mem,a1
  5218.         move.l    a1,a2
  5219.         moveq    #-1,d2
  5220.  
  5221.         move.w    ts_size,d1
  5222.         bpl.b    .oksize
  5223.         lea.l    firstts_txt(pc),a0
  5224.         bsr    print
  5225.         bra.w    end_command
  5226. .oksize        beq.w    .go_b
  5227.  
  5228.         cmp.w    #1,d1
  5229.         bne.w    .go_l
  5230.  
  5231.         moveq    #8,d1
  5232. .seek1        tst.b    break
  5233.         bne.w    .end_seek
  5234.         cmp.l    (a1),d2
  5235.         beq.w    .end_seek
  5236.         move.l    (a1)+,a4
  5237.         RELOC_PIC 1
  5238.         cmp.w    (a4),d4
  5239.         bgt.w    .seek1
  5240.         cmp.w    (a4),d3
  5241.         blt.w    .seek1
  5242.         move.l    -4(a1),d0
  5243.         move.l    d0,(a2)+
  5244.         lea.l    tf_txt+1,a0
  5245.         bsr    conv_hex
  5246.         lea.l    tf_txt,a0
  5247.         bsr    print
  5248.         bra.w    .seek1
  5249.  
  5250. .go_l        moveq    #8,d1
  5251. .seek2        tst.b    break
  5252.         bne.w    .end_seek
  5253.         cmp.l    (a1),d2
  5254.         beq.w    .end_seek
  5255.         move.l    (a1)+,a4
  5256.         RELOC_PIC 2
  5257.         cmp.l    (a4),d4
  5258.         bgt.w    .seek2
  5259.         cmp.l    (a4),d3
  5260.         blt    .seek2
  5261.         move.l    -4(a1),d0
  5262.         move.l    d0,(a2)+
  5263.         lea.l    tf_txt+1,a0
  5264.         bsr    conv_hex
  5265.         lea.l    tf_txt,a0
  5266.         bsr    print
  5267.         bra.w    .seek2
  5268.  
  5269. .go_b        moveq    #8,d1
  5270. .seek3        tst.b    break
  5271.         bne.w    .end_seek
  5272.         cmp.l    (a1),d2
  5273.         beq.w    .end_seek
  5274.         move.l    (a1)+,a4
  5275.         RELOC_PIC 3
  5276.         cmp.b    (a4),d4
  5277.         bgt.w    .seek3
  5278.         cmp.b    (a4),d3
  5279.         blt.w    .seek3
  5280.         move.l    -4(a1),d0
  5281.         move.l    d0,(a2)+
  5282.         lea.l    tf_txt+1,a0
  5283.         bsr    conv_hex
  5284.         lea.l    tf_txt,a0
  5285.         bsr    print
  5286.         bra.w    .seek3
  5287.  
  5288. .end_seek    move.l    d2,(a2)        ;set new end signal
  5289.  
  5290.         cmp.l    #tmp_mem+tmp_mem_size-4,a2
  5291.         bge.b    .noscan
  5292.  
  5293.         move.l    a2,a0        ;tmp_mem buffer
  5294.         move.l    d7,d0        ;nb of lives
  5295.         bsr    live_scan
  5296.  
  5297. .noscan        tst.w    cursor_x
  5298.         beq.b    .no_CR
  5299.         lea.l    cr_txt,a0
  5300.         bsr    print
  5301. .no_CR        bra.w    end_command
  5302.  
  5303. firstts_txt    dc.b "First use TS command !",$a,0
  5304.         even
  5305.  
  5306. ;-------------- debug -------------------------------------
  5307.  
  5308. cmd_debug    bsr    remove_pic
  5309.  
  5310.         not.b    debug
  5311.         beq.w    .clear
  5312.         move.l    vbr_reg,a0
  5313.         move.l    $8(a0),exc8        ;BUS
  5314.         move.l    $c(a0),excC        ;Address
  5315.         move.l    $10(a0),exc10        ;Illegal
  5316.         move.l    $14(a0),exc14        ;Zero
  5317.         move.l    $28(a0),exc28        ;LineA
  5318.         move.l    $2C(a0),exc2C        ;LineF
  5319.  
  5320.         lea.l    debug_bus(pc),a1
  5321.         move.l    a1,$8(a0)
  5322.         lea.l    debug_addr(pc),a1
  5323.         move.l    a1,$C(a0)
  5324.         lea.l    debug_illegal(pc),a1
  5325.         move.l    a1,$10(a0)
  5326.         lea.l    debug_zero(pc),a1
  5327.         move.l    a1,$14(a0)
  5328.         lea.l    debug_linea(pc),a1
  5329.         move.l    a1,$28(a0)
  5330.         lea.l    debug_linef(pc),a1
  5331.         move.l    a1,$2c(a0)
  5332.  
  5333.         lea.l    debug1_txt,a0
  5334.         bsr    print
  5335.         bra.w    .okset
  5336.  
  5337. .clear        move.l    vbr_reg,a0
  5338.         lea.l    debug_bus(pc),a1
  5339.         cmp.l    $8(a0),a1
  5340.         bne.b    .no8
  5341.         move.l    exc8,$8(a0)
  5342. .no8        lea.l    debug_addr(pc),a1
  5343.         cmp.l    $C(a0),a1
  5344.         bne.b    .noC
  5345.         move.l    excC,$C(a0)
  5346. .noC        lea.l    debug_illegal(pc),a1
  5347.         cmp.l    $10(a0),a1
  5348.         bne.b    .no10
  5349.         move.l    exc10,$10(a0)
  5350. .no10        lea.l    debug_zero(pc),a1
  5351.         cmp.l    $14(a0),a1
  5352.         bne.b    .no14
  5353.         move.l    exc14,$14(a0)
  5354. .no14        lea.l    debug_linea(pc),a1
  5355.         cmp.l    $28(a0),a1
  5356.         bne.b    .no28
  5357.         move.l    exc28,$28(a0)
  5358. .no28        lea.l    debug_linef(pc),a1
  5359.         cmp.l    $2C(a0),a1
  5360.         bne.b    .no2C
  5361.         move.l    exc2C,$2C(a0)
  5362. .no2C
  5363.         lea.l    debug2_txt,a0
  5364.         bsr    print
  5365.  
  5366. .okset        bsr    set_pic
  5367.         bra.w    end_command
  5368.  
  5369. debug1_txt    dc.b "Debug mode on.",$a,0
  5370. debug2_txt    dc.b "Debug mode off.",$a,0
  5371.         even
  5372.  
  5373. debug_bus    move.b    #1,debug_entry
  5374.         jmp    monitor
  5375. debug_addr    move.b    #2,debug_entry
  5376.         jmp    monitor
  5377. debug_illegal    move.b    #3,debug_entry
  5378.         jmp    monitor
  5379. debug_zero    move.b    #4,debug_entry
  5380.         jmp    monitor
  5381. debug_linea    move.b    #5,debug_entry
  5382.         jmp    monitor
  5383. debug_linef    move.b    #6,debug_entry
  5384.         jmp    monitor
  5385.  
  5386. ;debug_entry 1=bus,2=addr,3=illegal,4=zero,5=linea,6=linef
  5387.  
  5388. ;-------------- print if entered from debug mode ----------
  5389.  
  5390. check_debug    movem.l    d0/a0,-(a7)
  5391.         moveq    #0,d0
  5392.         move.b    debug_entry,d0
  5393.         beq.b    .nodeb
  5394.         lsl.w    #2,d0
  5395.         move.l    debug_txt(pc,d0.w),a0
  5396.         bsr    print
  5397.         sf    debug_entry
  5398. .nodeb        movem.l    (a7)+,d0/a0
  5399.         rts
  5400.  
  5401. debug_txt    dc.l 0
  5402.         dc.l .bus_txt
  5403.         dc.l .addr_txt
  5404.         dc.l .illegal_txt
  5405.         dc.l .zero_txt
  5406.         dc.l .linea_txt
  5407.         dc.l .linef_txt
  5408.  
  5409. .bus_txt    dc.b "Debug mode: Bus error",$a,0
  5410. .addr_txt    dc.b "Debug mode: Illegal address",$a,0
  5411. .illegal_txt    dc.b "Debug mode: Illegal instruction",$a,0
  5412. .zero_txt    dc.b "Debug mode: Division by zero",$a,0
  5413. .linea_txt    dc.b "Debug mode: Line-A instruction",$a,0
  5414. .linef_txt    dc.b "Debug mode: Line-F instruction",$a,0
  5415.         even
  5416.  
  5417. ;----------------------------------------------------------
  5418.  
  5419. ;NODISK_ERR        equ 1
  5420. ;TRACKCORRUPT_ERR    equ 2
  5421. ;BADCHECKSUM_ERR    equ 3
  5422. ;NOTDOS_ERR        equ 4
  5423. ;WRITEPROTECT_ERR    equ 5
  5424. ;CREATEFILE_ERR        equ 6
  5425. ;FILENOTFOUND_ERR    equ 7
  5426. ;DISKFULL_ERR        equ 8
  5427. ;FILEEXIST_ERR        equ 9
  5428. ;DEVICENOTFOUND_ERR    equ 10
  5429. ;ILLEGALPATH_ERR    equ 11
  5430. ;NOFFS_ERR        equ 12
  5431. ;IDE_ERR        equ 13
  5432. ;NOTEMPTY_ERR        equ 14
  5433.  
  5434. ;check if disk cleanup needed
  5435.  
  5436. end_disk:    movem.l    d0-a6,-(a7)
  5437.         tst.b    disk_op
  5438.         beq.w    .no_disk_op
  5439.         sf    disk_op
  5440.  
  5441.         bsr    flush_fbuffer        ;flush file buffers
  5442.         tst.b    floppy_op
  5443.         beq.b    .noflo
  5444.         sf    floppy_op
  5445.         bsr    motor_off
  5446. .noflo        clr.l    bitmap_part        ;clear bitmap buffer
  5447.  
  5448.         clr.l    file_handle1        ;free
  5449.         clr.l    file_handle2        ;both file_handle
  5450.  
  5451.         lea.l    track_sector,a0
  5452.         moveq    #-1,d1
  5453.         move.l    d1,(a0)+
  5454.         move.l    d1,(a0)+
  5455.         move.l    d1,(a0)+
  5456.         move.w    d1,track_buffer_no
  5457.  
  5458.         move.w    drive_err,d0
  5459.         beq.w    .noerr
  5460.         clr.w    drive_err
  5461.  
  5462.         lea.l    no_disk_txt,a0        ;1
  5463.         subq.w    #1,d0
  5464.         beq.w    .ok
  5465.         lea.l    corrupt_txt,a0        ;2
  5466.         subq.w    #1,d0
  5467.         beq.w    .ok
  5468.         lea.l    bad_sum_txt,a0        ;3
  5469.         subq.w    #1,d0
  5470.         beq.b    .ok
  5471.         lea.l    NotDOS_txt,a0        ;4
  5472.         subq.w    #1,d0
  5473.         beq.b    .ok
  5474.         lea.l    WriteProt_txt,a0    ;5
  5475.         subq.w    #1,d0
  5476.         beq.b    .ok
  5477.         lea.l    CreateFile_txt,a0    ;6
  5478.         subq.w    #1,d0
  5479.         beq.b    .ok
  5480.         lea.l    FileNotFound_txt,a0    ;7
  5481.         subq.w    #1,d0
  5482.         beq.b    .ok
  5483.         lea.l    DiskFull_txt,a0        ;8
  5484.         subq.w    #1,d0
  5485.         beq.b    .ok
  5486.         lea.l    FileExists_txt,a0    ;9
  5487.         subq.w    #1,d0
  5488.         beq.b    .ok
  5489.         lea.l    DeviceNotFound_txt,a0    ;10
  5490.         subq.w    #1,d0
  5491.         beq.b    .ok
  5492.         lea.l    IllegalPath_txt,a0    ;11
  5493.         subq.w    #1,d0
  5494.         beq.b    .ok
  5495.         lea.l    NoFFS_txt,a0        ;12
  5496.         subq.w    #1,d0
  5497.         beq.b    .ok
  5498.         lea.l    IDEerr_txt,a0        ;13
  5499.         subq.w    #1,d0
  5500.         beq.b    .ok
  5501.         lea.l    NotEmpty_txt,a0        ;14
  5502.  
  5503.  
  5504. ;        subq.w    #1,d0
  5505. ;        beq.b    .ok
  5506. ;        nop
  5507. .ok
  5508.         bsr    print
  5509.  
  5510. .noerr
  5511.  
  5512. .no_disk_op    movem.l    (a7)+,d0-a6
  5513.         rts
  5514.  
  5515. ;-------------- type mem ------------------------
  5516.  
  5517. cmd_type    bsr evaluate
  5518.         bne.w    illegal_addr
  5519.         move.l    d0,a0
  5520.         bsr    print
  5521.         bra.w    end_command
  5522.  
  5523. ;-------------- find ----------------------------
  5524.  
  5525. cmd_f        bsr    evaluate
  5526.         bne.w    illegal_addr
  5527.         move.l    d0,find_start
  5528.         bsr    evaluate
  5529.         bne.w    illegal_addr
  5530.         move.l    d0,find_end
  5531.         movem.l    find_start,d0-d1
  5532.         cmp.l    d0,d1
  5533.         ble.w    illegal_addr
  5534.  
  5535.         lea.l    find_list,a1
  5536.         moveq    #0,d1            ;nb bytes
  5537. .loop        clr.w    eval_size
  5538.         bsr    evaluate
  5539.         bmi.w    illegal_val
  5540.         bgt.b    .end_find
  5541.         move.w    eval_size,d2
  5542.         move.w    d2,d3
  5543. .next        addq.w    #1,d1
  5544.         move.b    d0,(a1,d2.w)
  5545.         lsr.l    #8,d0
  5546.         dbf    d2,.next
  5547.         addq.w    #1,d3
  5548.         add.w    d3,a1
  5549.         cmp.l    #find_list+80,a1
  5550.         blt.b    .loop
  5551.  
  5552. .end_find    subq.w    #1,d1
  5553.         bmi.w    illegal_val
  5554.         movem.l    find_start,a0-a1
  5555.         cmp.l    a0,a1
  5556.         ble.w    illegal_addr
  5557.  
  5558.  
  5559.         lea.l    find_list,a2
  5560.         move.b    (a2)+,d0
  5561. .seek        cmp.l    a1,a0
  5562.         bge.w    .end_seek
  5563.         tst.b    break
  5564.         bne.w    .end_seek
  5565.         move.l    a0,watch
  5566.         move.l    a0,a4
  5567.         RELOC_PIC
  5568.         addq.l    #1,a0
  5569.         cmp.b    (a4)+,d0
  5570.         bne.w    .seek
  5571.         move.w    d1,d2
  5572.         move.l    a2,a3
  5573.         bra.b    .dbf
  5574. .comp        move.b    (a3)+,d3
  5575.         cmp.b    (a4)+,d3
  5576.         bne.w    .seek
  5577. .dbf        dbf    d2,.comp
  5578.         movem.l    d0-d1/a0,-(a7)
  5579.         move.l    a0,d0
  5580.         subq.l    #1,d0
  5581.         lea.l    ev_line,a0
  5582.         move.w    #$2020,8(a0)
  5583.         clr.b    10(a0)
  5584.         moveq    #8,d1
  5585.         bsr    conv_hex
  5586.         bsr    print
  5587.         movem.l    (a7)+,d0-d1/a0
  5588.         bra.w    .seek
  5589.  
  5590. .end_seek    tst.w    cursor_x
  5591.         beq.b    .no_CR
  5592.         lea.l    cr_txt,a0
  5593.         bsr    print
  5594. .no_CR
  5595.         bra.w    end_command
  5596.  
  5597. cr_txt        dc.b $a,0
  5598.  
  5599. ;-------------- find instruction ----------------
  5600.  
  5601. cmd_fi        bsr    evaluate
  5602.         bne.w    illegal_addr
  5603.         and.w    #$fffe,d0
  5604.         move.l    d0,find_start
  5605.         bsr    evaluate
  5606.         bne.w    illegal_addr
  5607.         and.w    #$fffe,d0
  5608.         move.l    d0,find_end
  5609.  
  5610.         movem.l    find_start,d0-d1
  5611.         cmp.l    d0,d1
  5612.         ble.w    illegal_addr
  5613.  
  5614.         lea.l    find_list,a1
  5615.         bsr    read_name
  5616.         tst.b    (a1)
  5617.         beq.w    illegal_string
  5618.  
  5619. .re_jok        lea.l    find_list,a0
  5620.         cmp.b    #'*',(a0)    ;remove jokers at begining of line
  5621.         bne.b    .lower
  5622. .shift        move.b    1(a0),(a0)+
  5623.         bne.b    .shift
  5624.         bra.b    .re_jok
  5625.  
  5626. .lower        move.b    (a0),d0
  5627.         beq.b    .end_list
  5628.         bsr    lower_case
  5629.         move.b    d0,(a0)+
  5630.         bra.b    .lower
  5631.  
  5632. .end_list    movem.l    find_start,a0-a1
  5633.         cmp.l    a0,a1
  5634.         ble.w    illegal_addr
  5635.  
  5636.         move.l    a1,d7
  5637.         lea.l    ev_line,a1
  5638.         move.l    a1,d6
  5639.         lea.l    find_list,a1
  5640.         move.l    a1,d5
  5641.         moveq    #$a,d4
  5642.  
  5643. .loop2        cmp.l    d7,a0
  5644.         bge.w    .end_fi
  5645.         tst.b    break
  5646.         bne.w    .end_fi
  5647.  
  5648.         move.l    a0,watch
  5649.         move.l    a0,-(a7)
  5650.         move.l    a0,a4
  5651.         bsr    reloc_pic
  5652.         move.l    d6,a0            ;ev_line
  5653.         moveq    #%100,d0    ;lower case, no d $address,indirect
  5654.         bsr    disassemble
  5655.  
  5656.         move.l    d5,a0            ;find_list
  5657.         move.b    (a0)+,d0
  5658.         move.l    d6,a1            ;ev_line
  5659. .seek        move.b    (a1)+,d1
  5660.         cmp.b    d4,d1
  5661.         beq.w    .no_fi
  5662.         cmp.b    d0,d1
  5663.         bne.b    .seek
  5664.         move.l    a0,a2
  5665.         move.l    a1,a3
  5666. .loop        move.b    (a2)+,d2
  5667.         beq.b    .ok
  5668.         move.b    (a3)+,d1
  5669.         cmp.b    d4,d1
  5670.         beq.b    .seek
  5671.         cmp.b    #'*',d2            ;joker
  5672.         beq.b    .loop
  5673.         cmp.b    d2,d1
  5674.         beq.b    .loop
  5675.         bra.b    .seek
  5676.  
  5677. .ok
  5678.         move.l    (a7),a4
  5679.         RELOC_PIC
  5680.         move.l    d6,a0            ;ev_line
  5681.         moveq    #%111,d0    ;upper case, d $address, indirect
  5682.         bsr    disassemble
  5683.  
  5684.         move.l    d6,a0
  5685.         bsr    print            ;print disas. line
  5686.  
  5687. .no_fi        move.l    (a7)+,a0
  5688.         addq.l    #2,a0
  5689.         bra.w    .loop2
  5690.  
  5691. .end_fi
  5692.         bra.w    end_command
  5693.  
  5694. ;-------------- find instruction famicom -------------
  5695.  
  5696. cmd_fif        bsr    evaluate
  5697.         bne.w    illegal_addr
  5698.         move.l    d0,find_start
  5699.         bsr    evaluate
  5700.         bne.w    illegal_addr
  5701.         move.l    d0,find_end
  5702.  
  5703.         movem.l    find_start,d0-d1
  5704.  
  5705.         lea.l    find_list,a1
  5706.         bsr    read_name
  5707.         tst.b    (a1)
  5708.         beq.w    illegal_string
  5709.  
  5710.         lea.l    find_list,a0
  5711. .upper        move.b    (a0),d0
  5712.         beq.b    .end_list
  5713.         bsr    upper_case
  5714.         move.b    d0,(a0)+
  5715.         bra.b    .upper
  5716.  
  5717. .end_list    movem.l    find_start,a0-a1
  5718.         cmp.l    a0,a1
  5719.         ble.w    illegal_addr
  5720.  
  5721.         move.l    a1,d7
  5722.         lea.l    ev_line+10,a1
  5723.         move.l    a1,d6
  5724.         lea.l    find_list,a1
  5725.         move.l    a1,d5
  5726.         moveq    #$a,d4
  5727.  
  5728. .loop2        cmp.l    d7,a0
  5729.         bge.w    .end_fi
  5730.         tst.b    break
  5731.         bne.w    .end_fi
  5732.  
  5733.         move.l    a0,watch
  5734.         move.l    a0,-(a7)
  5735.         move.l    a0,a4
  5736.         RELOC_PIC
  5737.         move.l    d6,a0            ;ev_line+10
  5738.         bsr    f_disassemble
  5739.  
  5740.         move.l    d5,a0            ;find_list
  5741.         move.b    (a0)+,d0
  5742.         move.l    d6,a1            ;ev_line+10
  5743. .seek        move.b    (a1)+,d1
  5744.         cmp.b    d4,d1
  5745.         beq.b    .no_fi
  5746.         cmp.b    d0,d1
  5747.         bne.b    .seek
  5748.         move.l    a0,a2
  5749.         move.l    a1,a3
  5750. .loop        move.b    (a2)+,d2
  5751.         beq.b    .ok
  5752.         move.b    (a3)+,d1
  5753.         cmp.b    d4,d1
  5754.         beq.b    .seek
  5755.         cmp.b    d2,d1
  5756.         beq.b    .loop
  5757.         bra.b    .seek
  5758.  
  5759. .ok        move.l    (a7),d0
  5760.         moveq    #8,d1
  5761.         lea.l    ev_line,a0
  5762.         move.b    #' ',9(a0)
  5763.         move.b    #' ',(a0)+
  5764.         bsr    conv_hex
  5765.         lea.l    ev_line,a0
  5766.         bsr    print
  5767. .no_fi        move.l    (a7)+,a0
  5768.         addq.l    #1,a0
  5769.         bra.w    .loop2
  5770.  
  5771. .end_fi
  5772.         bra.w    end_command
  5773.  
  5774. ;-------------- change drive no -----------------
  5775. cmd_drive    bsr    evaluate
  5776.         bmi.w    illegal_val
  5777.         beq.b    .chg
  5778.         moveq    #0,d0
  5779.         move.w    drive,d0
  5780.         subq.w    #3,d0
  5781. .chg        moveq    #1,d1
  5782.         cmp.l    d1,d0
  5783.         bgt.w    illegal_val
  5784.         tst.l    d0
  5785.         bmi.w    illegal_val
  5786.         lea.l    drive_present,a0
  5787.         tst.b    (a0,d0.w)        ;drive is present ?
  5788.         beq.w    illegal_val
  5789.         addq.w    #3,d0
  5790.         move.w    d0,drive
  5791.         subq.b    #3,d0
  5792.         lea.l    drive_txt,a0
  5793.         bsr    print
  5794.         moveq    #1,d1
  5795.         bsr    print_hexCR
  5796.         bra.w    end_command
  5797.  
  5798. ;-------------- exit monitor --------------------
  5799.  
  5800. cmd_x        st    escape
  5801.         bra.w    end_command
  5802.  
  5803.  
  5804. ;-------------- KILL --------------------------------------
  5805.  
  5806. cmd_kill    st    escape
  5807.         st    kill
  5808.  
  5809.         bra.w    end_command
  5810.  
  5811. ;-------------- REBOOT ------------------------------------
  5812.  
  5813. cmd_reboot
  5814.         bsr    remove_pic
  5815.  
  5816.         move.l    $4.w,a0
  5817.         move.l    a0,d0
  5818.         lsr.l    #1,d0
  5819.         bcs.w    .nosafe
  5820.         lea.l    34(a0),a1
  5821.         moveq    #0,d0
  5822.         moveq    #$18-1,d1
  5823. .add        add.w    (a1)+,d0
  5824.         dbf    d1,.add
  5825.         not.w    d0
  5826.         cmp.w    82(a0),d0
  5827.         bne.w    .nosafe
  5828.  
  5829.         bsr    set_pic
  5830.  
  5831.         lea.l    surereboot_txt(pc),a0
  5832.         bsr    print
  5833.         bsr    get_key
  5834.         lea.l    sure2_txt(pc),a0
  5835.         bsr    print
  5836.         cmp.b    #'y',d0
  5837.         bne.b    .no
  5838.  
  5839.         bsr    remove_pic
  5840.  
  5841.         move.l    $4.w,a0
  5842.         clr.l    ColdCapture(a0)
  5843.         move.l    #cool-start+$48000,CoolCapture(a0)
  5844.  
  5845.         st    reboot
  5846.  
  5847.         lea.l    34(a0),a1
  5848.         moveq    #0,d0
  5849.         moveq    #$18-1,d1
  5850. .add2        add.w    (a1)+,d0
  5851.         dbf    d1,.add2
  5852.         not.w    d0
  5853.         move.w    d0,82(a0)
  5854.  
  5855.         move.l    $f80004,a0
  5856.         subq.l    #2,a0
  5857.         move.l    a0,pc_reg
  5858.         move.w    #$2700,sr_reg
  5859.         st    escape
  5860.  
  5861.         bsr    set_pic
  5862.  
  5863. .no        bra.w    end_command
  5864.  
  5865. .nosafe        lea.l    nosafe_txt(pc),a0
  5866.         bsr    print
  5867.         bra.w    end_command
  5868.  
  5869. nosafe_txt    dc.b "HRTmon can't reboot and stay resident !",$a
  5870.         dc.b "You have to perform this operation when ExecBase is still valid !",$a,0
  5871.  
  5872. surereboot_txt    dc.b "The machine will reboot!",$a
  5873.         dc.b "HRTmon will still be accessible to debug bootdisks",$a
  5874.         dc.b "Are you sure you want to continue ? (y/n)",$d,0
  5875.         even
  5876.  
  5877.  
  5878. cool        movem.l    d1-a6,-(a7)
  5879.  
  5880.         move.l    $4.w,a0
  5881.         clr.l    CoolCapture(a0)
  5882.         lea.l    34(a0),a1
  5883.         moveq    #0,d0
  5884.         moveq    #$18-1,d1
  5885. .add        add.w    (a1)+,d0
  5886.         dbf    d1,.add
  5887.         not.w    d0
  5888.         move.w    d0,82(a0)
  5889.  
  5890.         lea.l    $48000,a0
  5891.         lea.l    start,a1
  5892.         move.l    a1,a2
  5893.         move.l    #(end-start),d0
  5894.         lsr.l    #3,d0
  5895. .copy        move.l    (a0)+,(a1)+        ;restore HRTmon to its place
  5896.         move.l    (a0)+,(a1)+
  5897.         dbf    d0,.copy
  5898.  
  5899.         move.l    $4.w,a6
  5900.         jsr    -636(a6)        ;clear cache
  5901.  
  5902.         jmp    .next
  5903.  
  5904. .next        move.l    $4.w,a6
  5905.         lea.l    .super(pc),a5
  5906.         jsr    -30(a6)
  5907.  
  5908.         move.l    mon_size(pc),d0
  5909.         beq.b    .noalloc
  5910.         lea.l    start,a1
  5911.         jsr    -204(a6)
  5912.         tst.l    d0
  5913.         bne.b    .noalloc
  5914.         clr.l    mon_size        ;alloc failed
  5915. .noalloc
  5916.         sf    entered
  5917.  
  5918.  
  5919. ;.wait        move.w    $dff006,d0
  5920. ;        and.w    #$ff,d0
  5921. ;        move.w    #0,$dff106
  5922. ;        move.w    d0,$dff180
  5923. ;        btst    #6,$bfe001
  5924. ;        bne.b    .wait
  5925.  
  5926.         movem.l    (a7)+,d1-a6
  5927.         moveq    #0,d0
  5928.         rts
  5929.  
  5930.     MC68030
  5931. .super        movec    VBR,a4
  5932.         move.l    a4,old_vbr
  5933.         lea.l    new_except,a0
  5934.  
  5935.         move.l    a0,a1
  5936.         lea.l    except_entry(pc),a2
  5937.         move.w    #$400/4-1,d1
  5938. .init        move.l    a2,(a1)+
  5939.         dbf    d1,.init
  5940.  
  5941.         suba.l    a1,a1
  5942.         move.w    #$400/4-1,d1
  5943. .copy2        move.l    (a4)+,(a1)+
  5944.         dbf    d1,.copy2
  5945.  
  5946.         move.l    $7c(a0),oldlev7
  5947.         move.l    #monitor,$7c(a0)
  5948.         movec    a0,VBR
  5949.  
  5950.         rte
  5951.     MC68000
  5952.  
  5953. ;-------------- restart program at address ------
  5954.  
  5955. cmd_g        bsr    evaluate
  5956.         bmi.w    illegal_addr
  5957.         bne.b    .noaddr
  5958.         move.l    d0,pc_reg
  5959. .noaddr        st    escape
  5960.         bra.w    end_command
  5961.  
  5962. ;-------------- Load AmigaDOS file --------------
  5963.  
  5964. cmd_l        lea.l    ev_line,a1
  5965.         bsr    read_name
  5966.         tst.b    (a1)
  5967.         beq.w    illegal_name
  5968.  
  5969.         bsr    evaluate
  5970.         bne.w    illegal_addr
  5971.         tst.l    d0
  5972.         bmi.w    illegal_addr
  5973.         move.l    d0,d4
  5974.  
  5975.         bsr    remove_pic
  5976.  
  5977.         move.l    #ev_line,d1
  5978.         moveq    #0,d2            ;old file
  5979.         bsr    open_file
  5980.         move.l    d0,d7
  5981.         beq.b    .noopen
  5982.         move.l    d4,d2
  5983.         move.l    d7,a1
  5984.         move.l    file_size(a1),d3
  5985.         move.l    d3,d6
  5986.         move.l    d3,d1
  5987.         add.l    d2,d1            ;end address
  5988.         move.l    d2,d0
  5989.         move.l    d7,d1
  5990.         bsr    read_file
  5991. .bad        move.l    d7,d1
  5992.         bsr    close_file
  5993.  
  5994. .noopen        bsr    set_pic
  5995.  
  5996.         tst.w    drive_err
  5997.         bne.b    .end
  5998.  
  5999.         lea.l    file_len_txt,a0
  6000.         bsr    print
  6001.         moveq    #8,d1
  6002.         move.l    d6,d0
  6003.         bsr    print_hexCR
  6004.  
  6005. .end        bra.w    end_command
  6006.  
  6007. ;-------------- cd dir --------------------------
  6008.  
  6009. cmd_cd        lea.l    ev_line,a1
  6010.         bsr    read_name
  6011.         tst.b    (a1)
  6012.         beq.b    .nochg
  6013.  
  6014.         move.l    #ev_line,d1
  6015.         bsr    change_dir
  6016.  
  6017. .nochg        lea.l    ev_line,a0
  6018.         sf    (a0)
  6019.         move.l    a0,d1
  6020.         bsr    ExNext
  6021.         tst.l    d0
  6022.         bmi.b    .err
  6023.  
  6024.         move.l    d1,a3            ;partition
  6025.         move.l    d2,d0            ;parent block no
  6026.         bsr    print_path        ;path
  6027.  
  6028. .err        bra.w    end_command
  6029.  
  6030. ;-------------- dir -----------------------------
  6031.  
  6032. cmd_dir        lea.l    ev_line,a1
  6033.         bsr    read_name
  6034.  
  6035.         moveq    #0,d6            ;nb files printed
  6036.  
  6037.         move.l    #ev_line,d1
  6038.         bsr    ExNext
  6039.         tst.l    d0
  6040.         bmi.w    .err
  6041.  
  6042.         move.l    d0,-(a7)
  6043.         move.l    d1,a3            ;partition
  6044.         move.l    d2,d0            ;parent block no
  6045.         bsr    print_path        ;path
  6046.         move.l    (a7)+,d0
  6047.  
  6048.         tst.l    d0            ;empty dir ?
  6049.         beq.w    .err
  6050.  
  6051. .loop        addq.l    #1,d6
  6052.         move.l    d0,a1
  6053.         lea.l    general_txt,a0
  6054.         move.b    #' ',d0
  6055.         move.l    a0,a2
  6056.         moveq    #31-1,d2
  6057. .fill        move.b    d0,(a2)+
  6058.         dbf    d2,.fill
  6059.         sf    (a2)
  6060.  
  6061.         lea.l    file_name(a1),a2
  6062.         moveq    #0,d0
  6063.         move.b    (a2)+,d0        ;get file name size
  6064.         bra.b    .godbf
  6065. .copyn        move.b    (a2)+,(a0)+
  6066. .godbf        dbf    d0,.copyn
  6067.         lea.l    general_txt,a0
  6068.         bsr    print            ;print filename
  6069.  
  6070.         tst.b    file_dir(a1)
  6071.         beq.b    .okfile
  6072.         lea.l    dir_txt,a0
  6073.         bsr    print
  6074.         bra.b    .okdir
  6075. .okfile        move.l    file_size(a1),d0
  6076.         moveq    #7,d1
  6077.         bsr    print_dec
  6078.  
  6079. .okdir        lea.l    spc_txt,a0
  6080.         bsr    print
  6081.  
  6082.         move.l    d6,d0        ;nb files printed in d0
  6083.         move.w    screen_height,d1
  6084.         subq.w    #5,d1
  6085.         lsl.w    #1,d1
  6086.         divu    d1,d0        ;pause after 46(PAL) files printed
  6087.         swap    d0
  6088.         tst.w    d0
  6089.         bne.b    .no46
  6090.         bsr    get_key        ;wait for key pressed
  6091. .no46
  6092.         tst.b    break
  6093.         bne.b    .err
  6094.  
  6095.         move.l    a1,d1
  6096.         bsr    ExNext
  6097.         tst.l    d0
  6098.         bgt.w    .loop
  6099.  
  6100. .err        lsr.l    #1,d6
  6101.         bcc.b    .nocr
  6102.         lea.l    cr_txt,a0
  6103.         bsr    print
  6104.  
  6105. .nocr
  6106.         bra.w    end_command
  6107.  
  6108. dir_txt        dc.b "   (DIR)",0
  6109. spc_txt        dc.b " ",0
  6110.         even
  6111.  
  6112. ;-------------- calculate BootBlock checksum --------------
  6113.  
  6114. cmd_bb        bsr    evaluate
  6115.         bne.w    illegal_addr
  6116.         move.l    d0,a0
  6117.         move.l    a0,a1
  6118.         clr.l    4(a1)
  6119.  
  6120.         moveq    #0,d0
  6121.         move.w    #512*2/4-1,d1
  6122. .add        add.l    (a0)+,d0
  6123.         bcc.b    .noc
  6124.         addq.l    #1,d0
  6125. .noc        dbf    d1,.add
  6126.         not.l    d0
  6127.  
  6128.         move.l    d0,4(a1)
  6129.  
  6130.         bra.w    end_command
  6131.  
  6132. ;-------------- floppy access -------------------
  6133.  
  6134. cmd_disk1    move.b    #'R',d0
  6135.         bra.b    go_disk
  6136. cmd_disk2    move.b    #'W',d0
  6137. go_disk        move.b    d0,rwsec
  6138.  
  6139.         bsr    evaluate
  6140.         bne.w    illegal_addr
  6141.         move.l    d0,sec_addr
  6142.         bsr    evaluate
  6143.         bne.w    illegal_val
  6144.         tst.l    d0
  6145.         bmi.w    illegal_val
  6146.         cmp.l    #1759,d0
  6147.         bgt.w    illegal_val
  6148.         move.w    d0,strtsec
  6149.         move.l    d0,d1
  6150.  
  6151.         bsr    evaluate
  6152.         bne.w    illegal_val
  6153.         tst.l    d0
  6154.         bmi.w    illegal_val
  6155.         move.w    d0,nbsec
  6156.         add.l    d0,d1
  6157.         cmp.l    #1760,d1
  6158.         bgt.w    illegal_val
  6159.  
  6160.         move.l    sec_addr,d0
  6161.         move.w    nbsec,d1
  6162.         mulu    #512,d1
  6163.         add.l    d0,d1
  6164.  
  6165.         bsr    remove_pic
  6166.  
  6167.         bsr    test_present
  6168.         bne.b    .end_write
  6169.  
  6170.         move.l    sec_addr,a0
  6171.         movem.w    strtsec,d0-d1
  6172.         cmp.b    #'W',rwsec
  6173.         bne.b    .no_write
  6174.  
  6175.         bsr    write2
  6176.  
  6177.         bsr    force_change
  6178.  
  6179.         bra.b    .end_write
  6180.  
  6181. .no_write    bsr    read2
  6182. .end_write    bsr    set_pic
  6183.         bra.w    end_command
  6184.  
  6185. ;----------------------------------------------------------
  6186. ;-------------- test if a disk is present -----------------
  6187. ;-------------- if disk changed then flush track_buffer ---
  6188. ;-------------- used by non FileSystem commands (RS,WS...)-
  6189.  
  6190. ;<- FLAGS 0=ok_present
  6191.  
  6192. test_present    movem.l    d0/a3,-(a7)
  6193.         lea.l    floppy0,a3
  6194.         cmp.w    #3,drive
  6195.         beq.b    .go0
  6196.         lea.l    floppy1,a3
  6197. .go0        moveq    #0,d0            ;test cmd
  6198.         bsr    floppy_change
  6199.         tst.w    drive_err
  6200.         movem.l    (a7)+,d0/a3
  6201.         rts
  6202.  
  6203. ;--------------------------------------------------------------------
  6204. ;-------------- force change_disk to floppy selected in 'drive' -----
  6205.  
  6206. ;-> drive
  6207.  
  6208. force_change    movem.l    d0/a2-a3,-(a7)
  6209.         lea.l    floppy0,a3
  6210.         cmp.w    #3,drive
  6211.         beq.b    .f0
  6212.         cmp.w    #4,drive
  6213.         bne.b    .end
  6214.         lea.l    floppy1,a3
  6215. .f0        move.l    part_device(a3),a2
  6216.         clr.l    part_filesystem(a3)
  6217.         moveq    #1,d0            ;force change cmd
  6218.         jsr    CHANGE_CMD(a2)
  6219.         clr.l    bitmap_part        ;clear bitmap buffer
  6220. .end        movem.l    (a7)+,d0/a2-a3
  6221.         rts
  6222.  
  6223. ;-------------- disk check ----------------------
  6224.  
  6225. cmd_diskchk
  6226.  
  6227.         moveq    #0,d6
  6228.         move.w    #160-1,d7
  6229. .check        move.l    d6,d0
  6230.         lea.l    fbuf1,a0
  6231.         bsr    read_fsector
  6232.         tst.w    drive_err
  6233.         bne.b    .error
  6234.         tst.b    break
  6235.         bne.b    .error
  6236.         add.w    #11,d6
  6237.         dbf    d7,.check
  6238.  
  6239.         lea.l    .ok_txt(pc),a0
  6240.         bsr    print
  6241.  
  6242. .error
  6243.         bsr    force_change
  6244.  
  6245.         bra.w    end_command
  6246.  
  6247. .ok_txt        dc.b "Floppy disk is OK.",$a,0
  6248.  
  6249. ;-------------- format disk ---------------------
  6250.  
  6251. fconfirm1_txt    dc.b "Format disk in drive ",0
  6252. fconfirm2_txt    dc.b " (y/n) ?",$d,0
  6253.         even
  6254.  
  6255. cmd_format    lea.l    ev_line,a1
  6256.         bsr.w    read_name
  6257.  
  6258.         lea.l    fconfirm1_txt,a0
  6259.         bsr    print
  6260.         move.w    drive,d0
  6261.         subq.w    #3,d0
  6262.         moveq    #1,d1
  6263.         bsr    print_dec
  6264.         lea.l    fconfirm2_txt,a0
  6265.         bsr    print
  6266.  
  6267.         bsr    get_key
  6268.         lea.l    diskclr_txt(pc),a0
  6269.         bsr    print
  6270.         cmp.b    #'y',d0
  6271.         bne.w    .endformat
  6272.  
  6273.         bsr    test_present
  6274.         bne.w    .endformat
  6275.  
  6276.         lea.l    $40000,a0        ;dummy addr for format
  6277.         moveq    #0,d0
  6278.         moveq    #-1,d1            ;format all disk
  6279.         moveq    #-1,d7            ;write
  6280.         bsr    access
  6281.  
  6282.         tst.b    break
  6283.         bne.b    .break
  6284.  
  6285.         lea.l    format_block,a0
  6286.         lea.l    secbuf,a1
  6287.         moveq    #512/16-1,d0
  6288. .copy        move.l    (a0)+,(a1)+
  6289.         move.l    (a0)+,(a1)+
  6290.         move.l    (a0)+,(a1)+
  6291.         move.l    (a0)+,(a1)+
  6292.         dbf    d0,.copy
  6293.  
  6294.         lea.l    ev_line,a1
  6295.         tst.b    (a1)
  6296.         beq.w    .no_set
  6297.         move.l    a1,d1            ;source name (ended by a zero)
  6298.         lea.l    secbuf+108*4,a2        ;dest BCPL
  6299.         bsr    copy_name2
  6300. .no_set
  6301.         lea.l    secbuf,a0
  6302.         bsr    calc_sum
  6303.         move.w    #880,d0
  6304.         bsr    write_fsector
  6305.         lea.l    format_block+512,a0
  6306.         move.w    #881,d0
  6307.         bsr    write_fsector
  6308.         bsr    write_flush
  6309.  
  6310. .break        bsr    force_change
  6311.  
  6312. .endformat
  6313.  
  6314.         bra.w    end_command
  6315.  
  6316. ;-------------- FORMATQ ------------------------
  6317. cmd_formatq    lea.l    ev_line,a1
  6318.         bsr.w    read_name
  6319.  
  6320.         lea.l    fconfirm1_txt,a0
  6321.         bsr    print
  6322.         move.w    drive,d0
  6323.         subq.w    #3,d0
  6324.         moveq    #1,d1
  6325.         bsr    print_dec
  6326.         lea.l    fconfirm2_txt,a0
  6327.         bsr    print
  6328.  
  6329.         bsr    get_key
  6330.         lea.l    diskclr_txt(pc),a0
  6331.         bsr    print
  6332.         cmp.b    #'y',d0
  6333.         bne.w    .endformat
  6334.  
  6335.         bsr    test_present
  6336.         bne.w    .endformat
  6337.  
  6338.         lea.l    format_block,a0
  6339.         lea.l    secbuf,a1
  6340.         moveq    #512/16-1,d0
  6341. .copy        move.l    (a0)+,(a1)+
  6342.         move.l    (a0)+,(a1)+
  6343.         move.l    (a0)+,(a1)+
  6344.         move.l    (a0)+,(a1)+
  6345.         dbf    d0,.copy
  6346.  
  6347.         lea.l    ev_line,a1
  6348.         tst.b    (a1)
  6349.         beq.b    .no_set
  6350.         move.l    a1,d1            ;source name (ended by a zero)
  6351.         lea.l    secbuf+108*4,a2        ;dest BCPL
  6352.         bsr    copy_name2
  6353. .no_set
  6354.         lea.l    secbuf,a0
  6355.         bsr    calc_sum
  6356.         move.w    #880,d0
  6357.         bsr    write_fsector
  6358.         lea.l    format_block+512,a0
  6359.         move.w    #881,d0
  6360.         bsr    write_fsector
  6361.  
  6362.         lea.l    secbuf,a0
  6363.         move.l    a0,a1
  6364.         moveq    #512/4-1,d0
  6365. .clr        clr.l    (a1)+
  6366.         dbf    d0,.clr
  6367.         move.l    #$444f5301,(a0)        ;'DOS',1 (FFS)
  6368.         moveq    #0,d0
  6369.         bsr    write_fsector
  6370.  
  6371.         bsr    write_flush
  6372.  
  6373.         bsr    force_change
  6374.  
  6375. .endformat
  6376.         bra.w    end_command
  6377.  
  6378. ;-------------- evaluate expression -------------
  6379. cmd_ev        bsr    evaluate
  6380.         bne.w    illegal_expr
  6381.  
  6382.         lea.l    ev_line,a0
  6383.         move.b    #'$',(a0)+
  6384.         moveq    #8,d1
  6385.         bsr    conv_hex
  6386.         addq.l    #8,a0
  6387.         moveq    #$20,d6
  6388.         move.b    d6,(a0)+
  6389.  
  6390.         moveq    #10,d1
  6391.         bsr    conv_dec
  6392.  
  6393.         move.b    d6,(a0)+
  6394.         move.b    #'"',(a0)+
  6395.         moveq    #0,d1
  6396.         lea.l    ascIIx,a1
  6397.         rol.l    #8,d0
  6398.         move.b    d0,d1
  6399.         move.b    (a1,d1.w),(a0)+
  6400.         rol.l    #8,d0
  6401.         move.b    d0,d1
  6402.         move.b    (a1,d1.w),(a0)+
  6403.         rol.l    #8,d0
  6404.         move.b    d0,d1
  6405.         move.b    (a1,d1.w),(a0)+
  6406.         rol.l    #8,d0
  6407.         move.b    d0,d1
  6408.         move.b    (a1,d1.w),(a0)+
  6409.         move.b    #'"',(a0)+
  6410.  
  6411.         move.b    d6,(a0)+
  6412.  
  6413.         move.b    #'%',(a0)+
  6414.         moveq    #4-1,d2
  6415. .loop3        moveq    #8-1,d1
  6416. .loop2        addx.l    d0,d0
  6417.         bcc.b    .zero
  6418.         move.b    #'1',(a0)+
  6419.         bra.b    .un
  6420. .zero        move.b    #'0',(a0)+
  6421. .un        dbf    d1,.loop2
  6422.         move.b    #'.',(a0)+
  6423.         dbf    d2,.loop3
  6424.         subq.l    #1,a0
  6425.         move.b    #$a,(a0)+
  6426.         clr.b    (a0)+
  6427.  
  6428.         lea.l    ev_line,a0
  6429.         bsr    print
  6430.  
  6431.         bra.w    end_command
  6432.  
  6433. ;-------------- direct keyboard read (without IRQ) -------
  6434.  
  6435. ;<- dkey
  6436.  
  6437. get_dkey    movem.l    d0-d2,-(a7)
  6438.         move.b    $bfed01,d0
  6439.         btst    #3,d0
  6440.         beq.b    no_dkey
  6441.         move.b    $bfec01,d0
  6442.         not.b    d0
  6443.         ror.b    #1,d0
  6444.         bset    #6,$bfee01
  6445.         cmp.b    #$78,d0
  6446.         beq.w    go_reset
  6447.         moveq    #8-1,d1
  6448. .wait        move.b    6(a6),d2
  6449. .ras        cmp.b    6(a6),d2
  6450.         beq.b    .ras
  6451.         dbf    d1,.wait
  6452.         bclr    #6,$bfee01
  6453.         move.b    d0,dkey
  6454. no_dkey        movem.l    (a7)+,d0-d2
  6455.         rts
  6456.  
  6457. ;-------------- show registres (R) --------------
  6458. cmd_r
  6459. seek_reg    move.b    (a0)+,d0
  6460.         beq.w    end_chg_reg
  6461.         cmp.b    #$20,d0
  6462.         beq.b    seek_reg
  6463.         subq.l    #1,a0
  6464.  
  6465.         bsr    read_reg    ;read registre (no of reg in d0)
  6466.         move.w    d0,d5        ;save no registre in d5
  6467.         bmi.w    illegal_reg
  6468.  
  6469. seek_reg_val    move.b    (a0)+,d0
  6470.         beq.w    illegal_val
  6471.         cmp.b    #$20,d0
  6472.         beq.b    seek_reg_val
  6473.         subq.l    #1,a0
  6474.  
  6475.         bsr    evaluate
  6476.         bne.w    illegal_val
  6477.  
  6478.         cmp.w    #16,d5
  6479.         blt.b    ok_simple_reg
  6480. ;-----------------------------------------------
  6481.         bne.b    no_pc_chg
  6482.         move.l    d0,pc_reg
  6483.         bra.b    end_chg_reg
  6484. ;-----------------------------------------------
  6485. no_pc_chg    cmp.w    #19,d5
  6486.         bne.b    no_usp_chg
  6487.         move.l    d0,usp_reg
  6488. ;-----------------------------------------------
  6489. no_usp_chg    cmp.w    #20,d5
  6490.         bne.b    no_ssp_chg
  6491.         move.l    d0,ssp_reg
  6492. ;-----------------------------------------------
  6493. no_ssp_chg    cmp.w    #17,d5
  6494.         bne.b    no_sr_chg
  6495.         move.w    d0,sr_reg
  6496.         bra.b    end_chg_reg
  6497. ;-----------------------------------------------
  6498. no_sr_chg    cmp.w    #18,d5
  6499.         bne.b    no_vbr_chg
  6500.         move.l    d0,vbr_reg
  6501.         bra.b    end_chg_reg
  6502. ;-----------------------------------------------
  6503. no_vbr_chg    cmp.w    #21,d5
  6504.         bne.b    no_cacr_chg
  6505.         move.l    d0,cacr_reg
  6506.         bra.b    end_chg_reg
  6507. ;-----------------------------------------------
  6508. no_cacr_chg    cmp.w    #22,d5
  6509.         bne.b    no_pcr_chg
  6510.         move.l    d0,msp_reg
  6511.         bra.b    end_chg_reg
  6512. ;-----------------------------------------------
  6513. no_pcr_chg    cmp.w    #23,d5
  6514.         bne.b    no_busr_chg
  6515.         move.l    d0,caar_reg
  6516.         bra.b    end_chg_reg
  6517. ;-----------------------------------------------
  6518. no_busr_chg
  6519.         bra.b    end_chg_reg
  6520.  
  6521. ok_simple_reg    lea.l    registres,a0
  6522.         lsl.w    #2,d5
  6523.         move.l    d0,(a0,d5.w)
  6524.  
  6525. end_chg_reg    bsr    print_reg
  6526.         bra.w    end_command
  6527.  
  6528. ;-------------- print all registres -------------
  6529.  
  6530. print_reg    movem.l    d0-d1/a0-a1/a4,-(a7)
  6531.         moveq    #8,d1
  6532.         lea.l    registres,a1
  6533.         move.l    (a1)+,d0
  6534.         lea.l    data0_reg+3,a0
  6535.         bsr    conv_hex
  6536.         move.l    (a1)+,d0
  6537.         lea.l    data0_reg+3+9,a0
  6538.         bsr    conv_hex
  6539.         move.l    (a1)+,d0
  6540.         lea.l    data0_reg+3+18,a0
  6541.         bsr    conv_hex
  6542.         move.l    (a1)+,d0
  6543.         lea.l    data0_reg+3+27,a0
  6544.         bsr    conv_hex
  6545.         move.l    (a1)+,d0
  6546.         lea.l    data4_reg,a0
  6547.         bsr    conv_hex
  6548.         move.l    (a1)+,d0
  6549.         lea.l    data4_reg+9,a0
  6550.         bsr    conv_hex
  6551.         move.l    (a1)+,d0
  6552.         lea.l    data4_reg+18,a0
  6553.         bsr    conv_hex
  6554.         move.l    (a1)+,d0
  6555.         lea.l    data4_reg+27,a0
  6556.         bsr    conv_hex
  6557.  
  6558.         move.l    (a1)+,d0
  6559.         lea.l    addr0_reg+3,a0
  6560.         bsr    conv_hex
  6561.         move.l    (a1)+,d0
  6562.         lea.l    addr0_reg+3+9,a0
  6563.         bsr    conv_hex
  6564.         move.l    (a1)+,d0
  6565.         lea.l    addr0_reg+3+18,a0
  6566.         bsr    conv_hex
  6567.         move.l    (a1)+,d0
  6568.         lea.l    addr0_reg+3+27,a0
  6569.         bsr    conv_hex
  6570.         move.l    (a1)+,d0
  6571.         lea.l    addr4_reg,a0
  6572.         bsr    conv_hex
  6573.         move.l    (a1)+,d0
  6574.         lea.l    addr4_reg+9,a0
  6575.         bsr    conv_hex
  6576.         move.l    (a1)+,d0
  6577.         lea.l    addr4_reg+18,a0
  6578.         bsr    conv_hex
  6579.         move.l    (a1)+,d0
  6580.         lea.l    addr4_reg+27,a0
  6581.         bsr    conv_hex
  6582.  
  6583.         move.l    pc_reg,d0
  6584.         lea.l    pc_txt+3,a0
  6585.         bsr    conv_hex
  6586.         move.l    ssp_reg,d0
  6587.         lea.l    ssp_txt+4,a0
  6588.         bsr    conv_hex
  6589.         move.l    usp_reg,d0
  6590.         lea.l    usp_txt+4,a0
  6591.         bsr    conv_hex
  6592.         move.l    vbr_reg,d0
  6593.         lea.l    vbr_txt+4,a0
  6594.         bsr    conv_hex
  6595.  
  6596.         move.l    cacr_reg,d0
  6597.         lea.l    CACR_txt+5,a0
  6598.         bsr    conv_hex
  6599.         move.l    caar_reg,d0
  6600.         lea.l    CAAR_txt+5,a0
  6601.         bsr    conv_hex
  6602.         move.l    msp_reg,d0
  6603.         lea.l    MSP_txt+4,a0
  6604.         bsr    conv_hex
  6605.         move.l    isp_reg,d0
  6606.         lea.l    ISP_txt+4,a0
  6607.         bsr    conv_hex
  6608.  
  6609.         lea.l    sr_txt+3,a0
  6610.         moveq    #4,d1
  6611.         move.w    sr_reg,d0
  6612.         bsr    conv_hex
  6613.  
  6614.         move.l    a7_reg,a0
  6615.         and.w    #$2000,d0
  6616.         beq.b    no_superv_stack
  6617.         addq.l    #6,a0
  6618.         move.l    a0,a4
  6619.         bsr    reloc_pic
  6620.         move.w    (a4),d0            ;stack frame
  6621.         lsr.w    #4,d0
  6622.         lsr.w    #8,d0
  6623.         add.w    d0,d0
  6624.         lea.l    frame,a4
  6625.         add.w    (a4,d0.w),a0
  6626. no_superv_stack    move.l    pc_reg,a4
  6627.         bsr    reloc_pic
  6628.         move.b    #'S',rts_txt+2
  6629.         cmp.w    #$4e73,(a4)        ;cmp if RTE
  6630.         bne.b    no_rte
  6631.         addq.l    #2,a0            ;jmp SR for RTE
  6632.         move.b    #'E',rts_txt+2
  6633. no_rte        move.l    a0,a4
  6634.         bsr    reloc_pic
  6635.         move.l    (a4),d0            ;read RTS address
  6636.         lea.l    rts_txt+4,a0
  6637.         moveq    #8,d1
  6638.         bsr    conv_hex
  6639.  
  6640.         lea.l    registre_txt,a0
  6641.         bsr    print
  6642.  
  6643.         jsr    init_regBMON
  6644.  
  6645.         movem.l    (a7)+,d0-d1/a0-a1/a4
  6646.         rts
  6647.  
  6648. frame        dc.w 2,2,6,2,2,2,2,2,22,14,24,40,2,2,2 ;all stack frame size
  6649.  
  6650.  
  6651. ********************************************************************
  6652. ;-------------- print single instruction at dis_ptr  ---------------
  6653.  
  6654. ;d0 returns instruction len
  6655.  
  6656. single_inst    movem.l    d1-d7/a0-a4,-(a7)
  6657.  
  6658.         move.l    dis_ptr,a4
  6659.         bsr    reloc_pic
  6660.  
  6661.         lea.l    general_txt,a0
  6662.         moveq    #7,d0        ;upper case, d $address, indir. address
  6663.         bsr    disassemble
  6664.         lea.l    general_txt,a0
  6665.         bsr    print
  6666.  
  6667.         movem.l    (a7)+,d1-d7/a0-a4
  6668.         rts
  6669.  
  6670. ***************************************************************
  6671. ;-------------- hex dump (H) ---------------------
  6672.  
  6673. cmd_h        moveq    #0,d1
  6674. seek_para_h    move.b    (a0)+,d0
  6675.         beq.w    ok_h_cmd        ;keep last address
  6676.         cmp.b    #$20,d0
  6677.         beq.b    seek_para_h
  6678.         subq.l    #1,a0
  6679.  
  6680.         bsr    evaluate        ;returns address in d0
  6681.         bne.w    illegal_addr
  6682.         move.l    d0,hex_ptr
  6683.  
  6684.         move.l    d0,a3
  6685.  
  6686. .loop        move.b    (a0)+,d0
  6687.         beq.w    ok_h_cmd
  6688.         cmp.b    #"'",d0
  6689.         beq.b    ok_h_ascII
  6690.         cmp.b    #$20,d0
  6691.         beq.b    .loop
  6692.         subq.l    #1,a0
  6693.         st    label
  6694.         move.w    #1,eval_size    ;set .W par default
  6695.         bsr    evaluate
  6696.         beq.b    .oky
  6697.         sf    label
  6698.         bra.w    illegal_val
  6699. .oky        sf    label
  6700.         move.l    a3,a4
  6701.         bsr    reloc_pic
  6702.         move.w    eval_size,d2
  6703. .next        move.b    d0,(a4,d2.w)
  6704.         lsr.l    #8,d0
  6705.         addq.l    #1,a3
  6706.         dbf    d2,.next
  6707.         st    d1
  6708.         bra.b    .loop
  6709.  
  6710. ok_h_ascII    tst.b    d1
  6711.         bne.b    ok_h_cmd
  6712.         move.l    hex_ptr,a3
  6713. .loop        move.b    (a0)+,d0
  6714.         beq.b    ok_h_cmd
  6715.         cmp.b    #"'",d0
  6716.         beq.b    ok_h_cmd
  6717.         move.l    a3,a4
  6718.         bsr    reloc_pic
  6719.         move.b    d0,(a4)
  6720.         st    d1
  6721.         addq.l    #1,a3
  6722.         bra.b    .loop
  6723.  
  6724. ok_h_cmd    tst.b    d1
  6725.         bne.w    end_command
  6726.         move.l    hex_ptr,a4        ;a4=mem ptr
  6727.         move.l    a4,d0
  6728.  
  6729.         moveq    #8-1,d3            ;print 8 lines
  6730.         moveq    #15,d5
  6731.  
  6732. .loop2        bsr    make_hex_line
  6733.  
  6734.         lea.l    16(a4),a4
  6735.         lea.l    hex_txt,a0
  6736.         bsr    print
  6737.  
  6738.         tst.b    break
  6739.         dbne    d3,.loop2
  6740.  
  6741.         move.l    a4,hex_ptr
  6742.  
  6743.         bra.w    end_command
  6744.  
  6745. ;-------------- up arrow cmd ---------------
  6746.  
  6747. ;-> d2 = scroll step (1 or SC_STEP)
  6748.  
  6749. cmdu_h        move.l    ascII_ptr,a0
  6750.         move.w    d2,d0
  6751.         mulu    #80,d0
  6752.         add.l    d0,a0
  6753.         cmp.w    #'h ',(a0)    ;last top line was an hex dump ?
  6754.         bne.b    .noh
  6755.         addq.l    #2,a0
  6756.         bsr    evaluate    ;get last address
  6757.         move.l    d2,d1
  6758.         lsl.l    #4,d1        ;*16
  6759.         sub.l    d1,d0
  6760.         move.l    d0,a4
  6761.  
  6762.         subq.w    #1,d2
  6763. .print        bsr    make_hex_line
  6764.         lea.l    16(a4),a4
  6765.         lea.l    hex_txt,a0
  6766.         bsr    print
  6767.         dbf    d2,.print
  6768.  
  6769.         clr.w    2(a3)
  6770. ;        lea.l    hex_txt2,a1
  6771. ;        move.b    #$d,18(a1)
  6772. ;        move.b    #$a,18(a1)
  6773.  
  6774.         moveq    #0,d0
  6775.  
  6776. .noh        rts
  6777.  
  6778. ;-------------- down arrow cmd -------------
  6779.  
  6780. cmdd_h        move.l    ascII_ptr,a0
  6781.         move.w    window_bot,d0
  6782.         subq.w    #1,d0
  6783.         sub.w    d2,d0
  6784.         mulu    #80,d0
  6785.         add.l    d0,a0
  6786.         cmp.w    #'h ',(a0)    ;last line was an hex dump ?
  6787.         bne.b    .noh
  6788.         addq.l    #2,a0
  6789.         bsr    evaluate    ;get last address
  6790.         add.l    #16,d0
  6791.         move.l    d0,a4
  6792.  
  6793.         sub.w    d2,(2,a3)
  6794.  
  6795.         subq.w    #1,d2
  6796. .print        bsr    make_hex_line
  6797.         lea.l    hex_txt,a0
  6798.         bsr    print
  6799.         lea.l    16(a4),a4
  6800.         dbf    d2,.print
  6801.  
  6802.         move.l    a4,hex_ptr
  6803.  
  6804.         moveq    #0,d0
  6805.  
  6806. .noh        rts
  6807.  
  6808.  
  6809. ;-> a4=address to dump
  6810. ;<- hex_txt is filled with the dump text
  6811.  
  6812. make_hex_line    movem.l    d0-a4,-(a7)
  6813.         moveq    #$0f,d5
  6814.  
  6815.         move.l    a4,d0
  6816.         bsr    reloc_pic
  6817.  
  6818.         lea.l    ascIIx,a1
  6819.         lea.l    hex_list,a3
  6820.  
  6821.         lea.l    hex_txt+3,a0    ;print address
  6822.         moveq    #8,d1
  6823.         bsr    conv_hex
  6824.  
  6825.         lea.l    hex_txt+3+8+2,a0        ;long list
  6826.         lea.l    hex_txt2+1,a2        ;ascII print
  6827.         moveq    #2,d1                ;2 for conv_hex
  6828.         moveq    #0,d0
  6829.         moveq    #8-1,d6
  6830. .loopb        moveq    #2-1,d2
  6831. .loop        move.b    (a4)+,d0
  6832.         move.b    (a1,d0.w),(a2)+
  6833.         move.w    d0,d4
  6834.         and.w    d5,d4
  6835.         lsr.w    #4,d0
  6836.         move.b    (a3,d0.w),(a0)+
  6837.         move.b    (a3,d4.w),(a0)+
  6838.         dbf    d2,.loop
  6839.         addq.l    #2,a0
  6840.         dbf    d6,.loopb
  6841.  
  6842.         movem.l    (a7)+,d0-a4
  6843.         rts
  6844.  
  6845. ***************************************************************
  6846. ;-------------- ascII dump (n) ---------------------
  6847. cmd_n
  6848. seek_para_n    move.b    (a0)+,d0
  6849.         beq.b    ok_n_cmd        ;keep last address
  6850.         cmp.b    #$20,d0
  6851.         beq.b    seek_para_n
  6852.         subq.l    #1,a0
  6853.  
  6854.         bsr    evaluate        ;returns address in d0
  6855.         bne.w    illegal_addr
  6856.         move.l    d0,asc_ptr
  6857.  
  6858. ok_n_cmd    move.l    asc_ptr,a4        ;a4=mem ptr
  6859.         move.l    a4,d0
  6860.  
  6861.         moveq    #8-1,d3            ;print 8 lines
  6862.  
  6863. .loop2        moveq    #$a,d0
  6864.         bsr    make_ascII_line
  6865.  
  6866.         lea.l    general_txt,a0
  6867.         bsr    print
  6868.         lea.l    64(a4),a4
  6869.  
  6870.         tst.b    break
  6871.         dbne    d3,.loop2
  6872.  
  6873.         move.l    a4,asc_ptr
  6874.  
  6875.         bra.w    end_command
  6876.  
  6877. ;-------------- scroll up ascII dump ----------------------
  6878.  
  6879. cmdu_n        move.l    ascII_ptr,a0
  6880.         move.w    d2,d0
  6881.         mulu    #80,d0
  6882.         add.l    d0,a0
  6883.         cmp.w    #'n ',(a0)    ;last top line was an ascII dump ?
  6884.         bne.b    .non
  6885.         addq.l    #2,a0
  6886.         bsr    evaluate    ;get last address
  6887.         move.l    d2,d1
  6888.         lsl.l    #6,d1        ;*64
  6889.         sub.l    d1,d0
  6890.         move.l    d0,a4
  6891.  
  6892.         subq.w    #1,d2
  6893.  
  6894. .print        moveq    #$a,d0
  6895.         bsr    make_ascII_line
  6896.  
  6897.         lea.l    general_txt,a0
  6898.         bsr    print
  6899.  
  6900.         lea.l    64(a4),a4
  6901.  
  6902.         dbf    d2,.print
  6903.  
  6904.         clr.w    (2,a3)
  6905.  
  6906.         moveq    #0,d0
  6907.  
  6908. .non        rts
  6909.  
  6910. ;-------------- scroll down ascII dump --------------------
  6911.  
  6912. cmdd_n        move.l    ascII_ptr,a0
  6913.         move.w    window_bot,d0
  6914.         subq.w    #1,d0
  6915.         sub.w    d2,d0
  6916.         mulu    #80,d0
  6917.         add.l    d0,a0
  6918.         cmp.w    #'n ',(a0)    ;last line was an ascII dump ?
  6919.         bne.b    .non
  6920.         addq.l    #2,a0
  6921.         bsr    evaluate    ;get last address
  6922.         add.l    #64,d0
  6923.         move.l    d0,a4
  6924.  
  6925.         sub.w    d2,(2,a3)
  6926.  
  6927.         subq.w    #1,d2
  6928.  
  6929. .print        moveq    #$a,d0
  6930.         bsr    make_ascII_line
  6931.  
  6932.         lea.l    general_txt,a0
  6933.         bsr    print
  6934.  
  6935.         lea.l    64(a4),a4
  6936.  
  6937.         dbf    d2,.print
  6938.  
  6939.         move.l    a4,asc_ptr
  6940.  
  6941.  
  6942.         moveq    #0,d0
  6943.  
  6944. .non        rts
  6945.  
  6946.  
  6947. ;-> a4=mem ptr
  6948. ;-> d0=end line ascII ($a or $d)
  6949. ;<- general_txt filled with ascII line
  6950.  
  6951. make_ascII_line    movem.l    d0-a4,-(a7)
  6952.         move.b    d0,d7
  6953.         lea.l    ascIIx,a1
  6954.         move.l    a4,d0
  6955.         bsr    reloc_pic
  6956.  
  6957.         lea.l    general_txt,a0
  6958.         move.b    #'n',(a0)+
  6959.         move.b    #' ',(a0)+
  6960.         move.b    #'$',(a0)+
  6961.         moveq    #8,d1
  6962.         bsr    conv_hex
  6963.  
  6964.         lea.l    8(a0),a0
  6965.         move.b    #' ',(a0)+
  6966.         moveq    #0,d0
  6967.         moveq    #64-1,d2
  6968. .loop        move.b    (a4)+,d0
  6969.         move.b    (a1,d0.w),(a0)+
  6970.         dbf    d2,.loop
  6971.  
  6972.         move.b    d7,(a0)+
  6973.         sf    (a0)+
  6974.  
  6975.         movem.l    (a7)+,d0-a4
  6976.         rts
  6977.  
  6978. *********************************************************************
  6979. ;check address accessed and if needed relocate the HRTmon bitmap mem.
  6980. ;(bitmap is either at $20000 or at $60000)
  6981.  
  6982. ;-> a4=address accessed
  6983.  
  6984. reloc_pic:
  6985.         cmp.l    #$40000,a4
  6986.         bcs.b    .low
  6987. ;-------------- bitmap needs to be in $20000 ---------
  6988.         cmp.l    #$20000,pic_ptr
  6989.         beq.b    .ok_corr
  6990.         tst.b    pic_status
  6991.         bne.b    .pic_on1
  6992.         move.l    #$20000,pic_ptr
  6993.         bra.b    .ok_corr
  6994. .pic_on1    bsr    remove_pic
  6995.         move.l    #$20000,pic_ptr
  6996.         bsr    set_pic
  6997.         bra.b    .ok_corr
  6998.  
  6999. ;-------------- bitmap needs to be in $60000 ---------
  7000. .low        cmp.l    #$60000,pic_ptr
  7001.         beq.b    .ok_corr
  7002.         tst.b    pic_status
  7003.         bne.b    .pic_on2
  7004.         move.l    #$60000,pic_ptr
  7005.         bra.b    .ok_corr
  7006. .pic_on2    bsr    remove_pic
  7007.         move.l    #$60000,pic_ptr
  7008.         bsr    set_pic
  7009.  
  7010. .ok_corr    rts
  7011.  
  7012.  
  7013. ***************************************************
  7014. ;-------------- trace mode ------------------------
  7015. cmd_t        move.b    (a0)+,d0
  7016.         beq.w    single_trace
  7017.         cmp.b    #$20,d0
  7018.         beq.b    cmd_t
  7019.         bsr    upper_case
  7020.         cmp.b    #'A',d0
  7021.         bne.b    no_trace_a
  7022. ;-------------- trace till address reached -----
  7023. seek_tracea    move.b    (a0)+,d0
  7024.         beq.w    illegal_addr
  7025.         cmp.b    #$20,d0
  7026.         beq.b    seek_tracea
  7027.         subq.l    #1,a0
  7028.         bsr    evaluate
  7029.         bne.w    illegal_addr
  7030.         btst    #0,d0
  7031.         bne.w    illegal_addr
  7032.         move.l    d0,trace_address
  7033.         st    escape
  7034.         bra.w    end_command
  7035. ;-------------- trace x steps -----------
  7036. no_trace_a    subq.l    #1,a0
  7037.         bsr    evaluate
  7038.         bne.w    illegal_val
  7039.         tst.l    d0
  7040.         beq.w    illegal_val
  7041.         cmp.l    #$10000,d0
  7042.         bge.w    illegal_val
  7043. init_trace    move.w    d0,trace_count
  7044.         st    escape
  7045.         bra.w    end_command
  7046.  
  7047. single_trace    moveq    #1,d0
  7048.         bra.b    init_trace
  7049.  
  7050. ;---------------------------------------
  7051. trace_reach    move.l    a0,-(a7)
  7052.         lea.l    trace_count,a0
  7053.         subq.w    #1,(a0)
  7054.         beq.b    end_trace_mode
  7055.         move.l    (a7)+,a0
  7056.         or.w    #$8000,(a7)
  7057.         rte
  7058. end_trace_mode    move.l    vbr_reg,a0
  7059.         move.l    old_trace,$24(a0)
  7060.         move.l    (a7)+,a0
  7061.         and.w    #$7fff,(a7)
  7062.         bra.w    monitor
  7063. ;---------------------------------------------
  7064. tracea_reach    move.l    d0,-(a7)
  7065.         move.l    trace_address,d0
  7066.         cmp.l    2+4(a7),d0
  7067.         beq.b    end_tracea
  7068.         move.l    (a7)+,d0
  7069.         or.w    #$8000,(a7)
  7070.         rte
  7071. end_tracea    move.l    (a7)+,d0
  7072.         move.l    a0,-(a7)
  7073.         move.l    vbr_reg,a0
  7074.         move.l    old_trace,$24(a0)
  7075.         lea.l    trace_address,a0
  7076.         move.l    #-1,(a0)
  7077.         move.l    (a7)+,a0
  7078.         and.w    #$7fff,(a7)
  7079.         bra.w    monitor
  7080.  
  7081. ***************************************************
  7082. ;-------------- copy memory -----------------------
  7083. ;-------------- and exg (CE) memory ---------------
  7084.  
  7085. cmd_c        move.b    (a0),d0
  7086.         bsr    upper_case
  7087.         sf    exgc
  7088.         cmp.b    #'E',d0
  7089.         bne.b    no_exgc
  7090.         st    exgc
  7091.         addq.l    #1,a0
  7092.  
  7093. no_exgc        move.b    (a0)+,d0
  7094.         beq.w    illegal_addr
  7095.         cmp.b    #$20,d0
  7096.         beq.b    no_exgc
  7097.         subq.l    #1,a0
  7098.         bsr    evaluate
  7099.         bne.w    illegal_addr
  7100.         move.l    d0,copy_start
  7101.  
  7102. seek_end_copy    move.b    (a0)+,d0
  7103.         beq.w    illegal_addr
  7104.         cmp.b    #$20,d0
  7105.         beq.b    seek_end_copy
  7106.         subq.l    #1,a0
  7107.  
  7108.         bsr    evaluate
  7109.         bne.w    illegal_addr
  7110.         move.l    d0,copy_end
  7111.  
  7112. seek_dest_copy    move.b    (a0)+,d0
  7113.         beq.w    illegal_addr
  7114.         cmp.b    #$20,d0
  7115.         beq.b    seek_dest_copy
  7116.         subq.l    #1,a0
  7117.  
  7118.         bsr    evaluate
  7119.         bne.w    illegal_addr
  7120.         move.l    d0,copy_dest
  7121.  
  7122.         movem.l    copy_start,d0-d1
  7123.         sub.l    d0,d1                ;length
  7124.         move.l    copy_dest,d0
  7125.         add.l    d0,d1
  7126.         movem.l    copy_start,d0-d1
  7127.         cmp.l    d0,d1
  7128.         ble.w    illegal_addr            ;if end<start
  7129.  
  7130.         move.l    d0,a0
  7131.         move.l    d1,a2
  7132.         move.l    copy_dest,a1
  7133.  
  7134.         bsr    remove_pic
  7135.  
  7136.         moveq    #0,d0
  7137.         move.l    d0,$180(a6)
  7138.  
  7139.         tst.b    exgc
  7140.         beq.b    do_copy_mem
  7141.  
  7142. do_copye_mem    move.b    (a0),d0
  7143.         move.b    (a1),(a0)+
  7144.         move.b    d0,(a1)+
  7145.         cmp.l    a2,a0
  7146.         blt.b    do_copye_mem
  7147.         bra.b    end_copy
  7148.  
  7149. do_copy_mem    move.b    (a0)+,(a1)+
  7150.         cmp.l    a2,a0
  7151.         blt.b    do_copy_mem
  7152.  
  7153. end_copy    bsr    set_pic
  7154.  
  7155.         bra.w    end_command
  7156.  
  7157. ***************************************************
  7158. ;-------------- break point set -------------------
  7159. cmd_b        move.b    (a0)+,d0
  7160.         beq.w    illegal_addr
  7161.         bsr    upper_case
  7162.         moveq    #0,d7
  7163.         cmp.b    #'J',d0
  7164.         bne.w    no_jmp_break
  7165.         moveq    #-1,d7            ;jsr break mode on
  7166.         bra.b    seek_break
  7167.  
  7168. no_jmp_break    cmp.b    #'D',d0
  7169.         bne.b    no_del_break
  7170.         lea.l    break_list,a0
  7171.         moveq    #-1,d0
  7172. do_clr_all_BP    tst.l    (a0)
  7173.         bmi.b    cleared_all_BP
  7174.         clr.l    (a0)
  7175.         move.w    d0,4(a0)
  7176.         move.l    d0,6(a0)
  7177.         lea.l    10(a0),a0
  7178.         bra.b    do_clr_all_BP
  7179. cleared_all_BP    lea.l    all_BP_txt,a0
  7180.         bsr    print
  7181.         bra.w    end_command
  7182. ;-------------------------------------------
  7183.  
  7184. no_del_break    subq.l    #1,a0
  7185. seek_break    move.b    (a0)+,d0
  7186.         beq.w    print_break
  7187.         cmp.b    #$20,d0
  7188.         beq.b    seek_break
  7189.         subq.l    #1,a0
  7190.  
  7191.         bsr    evaluate
  7192.         bne.w    illegal_addr
  7193.         btst    #0,d0
  7194.         bne.w    illegal_addr
  7195.         move.l    d0,a2
  7196.  
  7197. ;-------------- check if clear BP command ------------
  7198.         lea.l    break_list,a1
  7199. seek_clear_BP    tst.l    (a1)
  7200.         bmi.b    end_clear_BP
  7201.         cmp.l    (a1),a2
  7202.         beq.b    pre_clear_BP
  7203.         lea.l    10(a1),a1
  7204.         bra.b    seek_clear_BP
  7205. pre_clear_BP    cmp.w    #-1,4(a1)
  7206.         bne.w    do_clear_BP
  7207.         lea.l    10(a1),a1
  7208.         bra.b    seek_clear_BP
  7209.  
  7210. ;-------------- add BP to list -----------------------
  7211.  
  7212. end_clear_BP    lea.l    break_list,a1
  7213. seek_free_break    tst.l    (a1)
  7214.         bmi.w    too_break
  7215.         tst.l    (a1)
  7216.         bne.b    break_used
  7217.         cmp.w    #-1,4(a1)
  7218.         beq.b    ok_break
  7219. break_used    lea.l    10(a1),a1
  7220.         bra.b    seek_free_break
  7221.  
  7222. ok_break    tst.l    d7
  7223.         beq.b    no_jsrb_set
  7224.         move.l    a2,(a1)            ;save address
  7225.         move.l    a2,a4
  7226.         bsr    reloc_pic
  7227.         move.w    (a4),4(a1)        ;save instr.
  7228.         move.l    2(a4),6(a1)        ;save param.
  7229.         moveq    #8,d1
  7230.         move.l    a2,d0
  7231.         lea.l    BPJ_set_txt,a0
  7232.         bsr    print
  7233.         bsr    print_hexCR
  7234.         bra.b    ok_jsrb_set
  7235.  
  7236. no_jsrb_set    move.l    a2,(a1)
  7237.         move.l    a2,a4
  7238.         bsr    reloc_pic
  7239.         move.w    (a4),4(a1)        ;save instr.
  7240.  
  7241.         moveq    #8,d1
  7242.         move.l    a2,d0
  7243.         lea.l    BP_set_txt,a0
  7244.         bsr    print
  7245.         bsr    print_hexCR
  7246.  
  7247. ok_jsrb_set
  7248.         bra.w    end_command
  7249. ;-------------- do clear BP command -----------------------
  7250.  
  7251. do_clear_BP    move.w    4(a1),(a2)
  7252.         clr.l    (a1)
  7253.         move.l    6(a1),d0
  7254.         cmp.l    #-1,d0
  7255.         beq.b    no_jsrb_clr
  7256.         move.l    d0,2(a2)
  7257. no_jsrb_clr    move.l    #-1,6(a1)
  7258.         move.w    #-1,4(a1)
  7259.         moveq    #8,d1
  7260.         move.l    a2,d0
  7261.         lea.l    BP_clr_txt,a0
  7262.         bsr    print
  7263.         bsr    print_hexCR
  7264.         bra.w    end_command
  7265.  
  7266. ;-------------- init break points when exiting HRTmon -----
  7267. init_break    movem.l    d0-d2/a0-a2,-(a7)
  7268.         sf    break_mode
  7269.         sf    BP_reach
  7270.         sf    BPJ_reach
  7271.         sf    BPatPC
  7272.         lea.l    break_list,a0
  7273. set_BP        tst.l    (a0)
  7274.         bmi.b    end_set_BP
  7275.         bne.b    set_break
  7276.         cmp.w    #-1,4(a0)
  7277.         bne.b    set_break
  7278.         lea.l    10(a0),a0
  7279.         bra.b    set_BP
  7280. set_break    cmp.l    #-1,6(a0)
  7281.         beq.b    no_BJSR_set
  7282.         move.l    (a0),a1
  7283.         move.w    #$4eb9,(a1)        ;JSR
  7284.         lea.l    JSR_reach,a2
  7285.         move.l    a2,2(a1)
  7286.         bra.b    end_BJ_set
  7287. no_BJSR_set    move.l    (a0),a1
  7288.         cmp.l    pc_reg,a1
  7289.         bne.b    .notpc
  7290.         st    BPatPC
  7291.         move.w    #1,trace_count
  7292.         bra.b    end_BJ_set
  7293. .notpc        move.w    #$4afc,(a1)
  7294.         st    break_mode
  7295. end_BJ_set    lea.l    10(a0),a0
  7296.         bra.b    set_BP
  7297. end_set_BP    tst.b    break_mode
  7298.         beq.b    no_break_mode
  7299.         move.l    vbr_reg,a0
  7300.         move.l    $10(a0),illegal_except
  7301.         lea.l    break_reach,a2
  7302.         move.l    a2,$10(a0)
  7303. no_break_mode    movem.l    (a7)+,d0-d2/a0-a2
  7304.         rts
  7305.  
  7306. ;-------------- remove all breakpoints from mem. -----
  7307. clear_break    movem.l    a0-a1,-(a7)
  7308.         lea.l    break_list,a0
  7309. do_clr_BP    tst.l    (a0)
  7310.         bmi.w    end_clear_BPa
  7311.         bne.b    ok_clr_BP
  7312.         cmp.w    #-1,4(a0)
  7313.         beq.b    no_clr_BP
  7314. ok_clr_BP    move.l    (a0),a1
  7315.         move.w    4(a0),(a1)
  7316.         cmp.l    #-1,6(a0)
  7317.         beq.b    no_clr_BP
  7318.         move.l    6(a0),2(a1)
  7319. no_clr_BP    lea.l    10(a0),a0
  7320.         bra.b    do_clr_BP
  7321. end_clear_BPa    movem.l    (a7)+,a0-a1
  7322.         rts
  7323.  
  7324. ;----------------------------------------------
  7325.  
  7326. break_reach    movem.l    a0-a1/a5,-(a7)
  7327.         move.l    2+12(a7),a0        ;fetch PC
  7328.         sf    BP_reach
  7329.         lea.l    break_list,a1
  7330. seek_BP_reach    tst.l    (a1)
  7331.         bmi.b    break_not_found
  7332.         bne.b    do_check_BP
  7333.         cmp.w    #-1,4(a1)
  7334.         beq.b    no_check_BP
  7335. do_check_BP    cmp.l    (a1),a0
  7336.         beq.b    found_break
  7337. no_check_BP    lea.l    10(a1),a1
  7338.         bra.b    seek_BP_reach
  7339.  
  7340. found_break    move.w    4(a1),(a0)        ;restore old instr.
  7341.         clr.l    (a1)
  7342.         move.w    #-1,4(a1)        ;clear old BP
  7343.         move.l    a0,Break_Address
  7344.         st    BP_reach
  7345.         movem.l    (a7)+,a0-a1/a5
  7346.         bra    monitor            ;enter monitor
  7347.  
  7348. break_not_found    movem.l    (a7)+,a0-a1/a5
  7349.         move.l    illegal_except,-(a7)
  7350.         rts                ;jmp old illegal
  7351.  
  7352. ;----------------------------------------------------------
  7353.  
  7354. JSR_reach    movem.l    a2,-(a7)
  7355.         lea.l    JB_save,a2
  7356.         movem.l    a0-a1,(a2)
  7357.         movem.l    (a7)+,a2
  7358.         movem.l    (a7)+,a0
  7359.         lea.l    Break_Address,a1
  7360.         move.l    a0,(a1)
  7361.         move.l    vbr_reg,a1
  7362.         move.l    $80(a1),.oldtrap0
  7363.         lea.l    .JB_sup(pc),a0
  7364.         move.l    a0,$80(a1)
  7365.         trap    #0
  7366. .oldtrap0    dc.l    0
  7367. .JB_sup        move.l    .oldtrap0,$80(a1)
  7368.         move.l    Break_Address,a0    ;fetch break_address
  7369.         subq.l    #6,a0            ;sub len jsr address
  7370.         lea.l    BPJ_reach,a1
  7371.         sf    (a1)
  7372.         lea.l    break_list,a1
  7373. seek_BPJ_reach    tst.l    (a1)
  7374.         bmi.b    bj_not_found
  7375.         bne.b    do_check_BPJ
  7376.         cmp.w    #-1,4(a1)
  7377.         beq.b    no_check_BPJ
  7378. do_check_BPJ    cmp.l    (a1),a0
  7379.         beq.b    found_breakJ
  7380. no_check_BPJ    lea.l    10(a1),a1
  7381.         bra.b    seek_BPJ_reach
  7382.  
  7383. found_breakJ    move.w    4(a1),(a0)        ;restore old instr.
  7384.         move.l    6(a1),2(a0)
  7385.         clr.l    (a1)
  7386.         move.w    #-1,4(a1)        ;clear old BP
  7387.         move.l    #-1,6(a1)
  7388.         move.l    a0,Break_Address
  7389.         st    BPJ_reach
  7390.         movem.l    JB_save,a0-a1
  7391.         move.l    Break_Address,2(a7)
  7392.         bra.w    monitor        ;enter monitor
  7393.  
  7394. bj_not_found    move.l    Break_Address,2(a7)
  7395.         movem.l    JB_save,a0-a1
  7396.         rte
  7397.  
  7398. ;--------------------------------------------------
  7399. print_break    lea.l    break_list,a1
  7400.         moveq    #8,d1
  7401. do_break_all    tst.l    (a1)
  7402.         bmi.b    end_break_all
  7403.         bne.b    ok_break_all
  7404.         cmp.w    #-1,4(a1)
  7405.         beq.b    no_break_all
  7406. ok_break_all    tst.l    6(a1)
  7407.         bmi.b    no_Bjsr_prt
  7408.         move.l    (a1),d0
  7409.         lea.l    all_break2_txt,a0
  7410.         bra.b    ok_Bjsr_prt
  7411.  
  7412. no_Bjsr_prt    move.l    (a1),d0
  7413.         lea.l    all_break_txt,a0
  7414. ok_Bjsr_prt    bsr    print
  7415.         bsr    print_hexCR
  7416.  
  7417. no_break_all    lea.l    10(a1),a1
  7418.         bra.b    do_break_all
  7419.  
  7420. end_break_all    bra.w    end_command
  7421.  
  7422. ***************************************************
  7423. ;-------------- disassemble (D) -------------------
  7424.  
  7425. cmd_d:        move.b    (a0)+,d0
  7426.         beq.b    ok_d_cmd        ;keep last address
  7427.         cmp.b    #$20,d0
  7428.         beq.b    cmd_d
  7429.         subq.l    #1,a0
  7430.  
  7431.         bsr    evaluate
  7432.         bne.w    illegal_addr
  7433.         btst    #0,d0            ;address must be even
  7434.         bne.w    illegal_addr
  7435.         move.l    d0,dis_ptr
  7436.  
  7437. ok_d_cmd    move.l    dis_ptr,d0        ;a4 = ptr on memory
  7438.         and.w    #$fffe,d0        ;even addr.
  7439.         move.l    d0,a4
  7440.  
  7441.         moveq    #8-1,d7
  7442. next_dis_line
  7443.         move.l    a4,-(a7)
  7444.         bsr    reloc_pic
  7445.  
  7446.         lea.l    general_txt,a0
  7447.         moveq    #7,d0            ;upper case, d $address
  7448.         bsr    disassemble
  7449.         move.l    (a7)+,a4
  7450.         add.w    d0,a4            ;add instr len
  7451.  
  7452.         lea.l    general_txt,a0
  7453.         bsr    print
  7454.  
  7455.         tst.b    break
  7456.         dbne    d7,next_dis_line
  7457.  
  7458.         move.l    a4,dis_ptr
  7459.  
  7460.         bra.w    end_command
  7461.  
  7462. ;-------------- scroll up disassemble --------
  7463.  
  7464. cmdu_d        move.l    ascII_ptr,a0
  7465.         lea.l    80(a0),a0
  7466.         cmp.w    #'D ',(a0)    ;last top line was a disassemble ?
  7467.         bne.w    .nod
  7468.         addq.l    #2,a0
  7469.         bsr    evaluate    ;get last address
  7470.         move.l    d0,d6        ;d6=address of next instr.
  7471.         move.l    d0,d5
  7472.         sub.l    #20,d5        ;d5=address to test
  7473.  
  7474. .loop        move.l    d5,a4
  7475.         bsr    reloc_pic
  7476.         moveq    #7,d0
  7477.         lea.l    general_txt,a0
  7478.         bsr    disassemble
  7479.         add.l    d5,d0
  7480.         cmp.l    d0,d6        ;right len of instr ?
  7481.         beq.b    .ok
  7482.  
  7483.         move.l    d0,d5
  7484.         cmp.l    d6,d5        ;reach end of area to test
  7485.         blt.b    .loop
  7486.  
  7487. ;---- couldn't find an instr. with the right length -> print 'dc.w'
  7488.  
  7489.         lea.l    general_txt,a0
  7490.         move.w    #"D ",(a0)+
  7491.         move.b    #"$",(a0)+
  7492.         move.l    d6,d0
  7493.         subq.l    #2,d0
  7494.         moveq    #8,d1
  7495.         bsr    conv_hex
  7496.         add.l    d1,a0
  7497.         move.b    #" ",(a0)+
  7498.         move.l    #"Dc.W",(a0)+
  7499.         move.w    #" $",(a0)+
  7500.         move.l    d6,a4
  7501.         bsr    reloc_pic
  7502.         move.w    (a4),d0
  7503.         moveq    #4,d1
  7504.         bsr    conv_hex
  7505.         add.l    d1,a0
  7506.         move.w    #$0a00,(a0)+
  7507.         bra.w    .ok
  7508.  
  7509. .ok        move.l    d5,d0
  7510.  
  7511.         lea.l    general_txt,a0
  7512.         bsr    print
  7513.         subq.w    #1,(2,a3)        ;cursor one line up
  7514.  
  7515.         moveq    #0,d0
  7516.  
  7517. .nod        rts
  7518.  
  7519. .bad_addr    lea.l    illegal_addr_txt,a0
  7520.         bsr    print
  7521.         bra.b    .nod
  7522.  
  7523. ;-------------- scroll down disassemble ---------
  7524.  
  7525. cmdd_d        move.l    ascII_ptr,a0
  7526.         move.l    d0,-(a7)
  7527.         move.w    window_bot,d0
  7528.         subq.w    #2,d0
  7529.         mulu    #80,d0
  7530.         add.l    d0,a0
  7531.         move.l    (a7)+,d0
  7532.         cmp.w    #'D ',(a0)    ;last line was a disassemble ?
  7533.         bne.b    .nod
  7534.         addq.l    #2,a0
  7535.         bsr    evaluate    ;get last address
  7536.         move.l    d0,d6
  7537.         move.l    d0,a4
  7538.         bsr    reloc_pic
  7539.         moveq    #0,d0
  7540.         lea.l    general_txt,a0
  7541.         bsr    disassemble    ;calc last instr size
  7542.         add.l    d6,d0
  7543.         move.l    d0,a4
  7544.         move.l    d0,d6
  7545.         bsr    reloc_pic
  7546.         moveq    #7,d0
  7547.         lea.l    general_txt,a0
  7548.         bsr    disassemble
  7549.         add.l    d0,d6            ;add instr. size
  7550.         move.l    d6,dis_ptr        ;next instr. address
  7551.  
  7552.         subq.w    #1,(2,a3)        ;cursor one line up
  7553.         lea.l    general_txt,a0
  7554.         bsr    print
  7555.  
  7556.         moveq    #0,d0
  7557.  
  7558. .nod        rts
  7559.  
  7560.  
  7561.         include src/65816.s
  7562.  
  7563. ***********************************************************
  7564. ;-------------- error routines ---------------------
  7565.  
  7566. illegal_syntax    lea.l    illegal_syntax_txt,a0
  7567.         bsr    print
  7568.         bra.w    end_command
  7569.  
  7570. illegal_val    lea.l    illegal_val_txt,a0
  7571.         bsr    print
  7572.         bra.w    end_command
  7573.  
  7574. illegal_reg    lea.l    illegal_reg_txt,a0
  7575.         bsr    print
  7576.         bra.w    end_command
  7577.  
  7578. illegal_addr    lea.l    illegal_addr_txt,a0
  7579.         bsr    print
  7580.         bra.w    end_command
  7581.  
  7582. illegal_name    lea.l    illegal_name_txt,a0
  7583.         bsr    print
  7584.         bra.w    end_command
  7585.  
  7586. illegal_string    lea.l    illegal_string_txt,a0
  7587.         bsr    print
  7588.         bra.w    end_command
  7589.  
  7590. illegal_expr    lea.l    illegal_expr_txt,a0
  7591.         bsr    print
  7592.         bra.w    end_command
  7593.  
  7594. too_break    lea.l    too_break_txt,a0
  7595.         bsr    print
  7596.         bra.w    end_command
  7597.  
  7598. not_found    lea.l    not_found_txt,a0
  7599.         bsr    print
  7600.         bra.w    end_command
  7601.  
  7602. *********************************************************
  7603. ;d0=ascII
  7604. upper_case:    cmp.b    #'a',d0            ;switch to upper case (d0)
  7605.         blt.b    .ok_upper
  7606.         cmp.b    #'z',d0
  7607.         bgt.b    .ok_upper
  7608.         add.b    #'A'-'a',d0
  7609. .ok_upper    rts
  7610.  
  7611. ;d0=ascII
  7612. lower_case    cmp.b    #'A',d0            ;switch to lower case (d0)
  7613.         blt.b    .ok_lower
  7614.         cmp.b    #'Z',d0
  7615.         bgt.b    .ok_lower
  7616.         add.b    #'a'-'A',d0
  7617. .ok_lower    rts
  7618.  
  7619. ;d1=ascII
  7620. upper_case1    cmp.b    #'a',d1            ;switch to upper case (d1)
  7621.         blt.b    .ok_upper
  7622.         cmp.b    #'z',d1
  7623.         bgt.b    .ok_upper
  7624.         add.b    #'A'-'a',d1
  7625. .ok_upper    rts
  7626.  
  7627. ************************************************************
  7628. ;read string at a0 and copy it in a1 (0=end of string)
  7629. ;' ' can surround a string
  7630.  
  7631. read_name    movem.l    d0/a1,-(a7)
  7632. .loop        cmp.b    #$20,(a0)+
  7633.         beq.b    .loop
  7634.         subq.l    #1,a0
  7635.         cmp.b    #"'",(a0)
  7636.         bne.b    .colle
  7637.         addq.l    #1,a0
  7638. .loop2        move.b    (a0)+,d0
  7639.         beq.b    .err
  7640.         cmp.b    #"'",d0
  7641.         bne.b    .g1
  7642.         cmp.b    #"'",(a0)
  7643.         bne.b    .end_n
  7644.         addq.l    #1,a0
  7645. .g1        move.b    d0,(a1)+
  7646.         bra.b    .loop2
  7647. .end_n        clr.b    (a1)+
  7648.         movem.l    (a7)+,d0/a1
  7649.         rts
  7650.  
  7651. .colle        move.b    (a0)+,d0
  7652.         beq.b    .err
  7653.         cmp.b    #$20,d0
  7654.         beq.b    .end_n
  7655.         move.b    d0,(a1)+
  7656.         bra.b    .colle
  7657.  
  7658. .err        movem.l    (a7)+,d0/a1
  7659.         clr.b    (a1)
  7660.         rts
  7661.  
  7662. *************************************************************
  7663. ;-> a0=ptr on ascII number
  7664. ;<- returns number in d0
  7665.  
  7666. read_number    movem.l    d1-d3/a1,-(a7)
  7667. .spc        cmp.b    #$20,(a0)+
  7668.         beq.b    .spc
  7669.         subq.l    #1,a0
  7670.         st    ok_numb
  7671.         sf    minus
  7672.         cmp.b    #'-',(a0)
  7673.         bne.b    .no_minus
  7674.         st    minus
  7675.         addq.l    #1,a0
  7676. .no_minus    moveq    #0,d2
  7677.         moveq    #0,d0
  7678.         cmp.b    #'#',(a0)
  7679.         bne.b    no_dec_num
  7680.  
  7681.         addq.l    #1,a0        ;jmp #
  7682.  
  7683. next_dec    move.b    (a0)+,d0
  7684.         cmp.b    #'0',d0
  7685.         blt.w    end_number
  7686.         cmp.b    #'9',d0
  7687.         bgt.w    end_number
  7688.         sub.b    #'0',d0
  7689.  
  7690.         add.l    d2,d2
  7691.         move.l    d2,d3
  7692.         lsl.l    #2,d2
  7693.         add.l    d3,d2        ;mulu    #10,d2
  7694.  
  7695.         add.l    d0,d2
  7696.         sf    ok_numb
  7697.         bra.b    next_dec
  7698.  
  7699. ;-------------- read binary number ------------------
  7700.  
  7701. no_dec_num    cmp.b    #'%',(a0)
  7702.         bne.b    no_bin_num
  7703.         addq.l    #1,a0
  7704.  
  7705.         moveq    #0,d2
  7706. .loop        move.b    (a0)+,d0
  7707.         sub.b    #'0',d0
  7708.         bmi.w    end_number
  7709.         cmp.b    #1,d0
  7710.         bgt.w    end_number
  7711.         add.l    d2,d2
  7712.         or.b    d0,d2
  7713.         sf    ok_numb
  7714.         bra.b    .loop
  7715.  
  7716. no_bin_num    cmp.b    #"'",(a0)
  7717.         bne.b    no_ascII_num
  7718.         addq.l    #1,a0
  7719.         moveq    #0,d2
  7720. .loop        move.b    (a0)+,d0
  7721.         beq.w    end_number
  7722.         cmp.b    #"'",d0
  7723.         bne.b    .no_end_ascII
  7724.         cmp.b    #"'",(a0)
  7725.         bne.b    end_ascII_num
  7726.         addq.l    #1,a0
  7727. .no_end_ascII    lsl.l    #8,d2
  7728.         move.b    d0,d2
  7729.         bra.b    .loop
  7730.  
  7731. end_ascII_num    addq.l    #1,a0
  7732.         sf    ok_numb
  7733.         bra.w    end_number
  7734.  
  7735. ;-------------- read hexa number + label --------------------
  7736.  
  7737. no_ascII_num    move.l    a0,a1
  7738.         tst.b    label    ;test if label enabled
  7739.         bne.b    .no_label
  7740.         bsr    check_label
  7741.         tst.l    d0
  7742.         beq.b    .no_label
  7743.         sf    ok_numb
  7744.         move.l    a4,-(a7)
  7745.         move.l    d0,a4
  7746.         bsr    reloc_pic
  7747.         move.l    (a4),d2
  7748.         move.l    (a7)+,a4
  7749.         addq.l    #1,a0
  7750.         bra.b    end_number
  7751.  
  7752. .no_label    move.l    a1,a0
  7753.         cmp.b    #'$',(a0)    ;jmp $ for hex number
  7754.         bne.w    next_dec
  7755.         addq.l    #1,a0        ;jmp $
  7756. .ok_dollar    lea.l    hex_list,a1
  7757. next_hex
  7758.         move.b    (a0)+,d0
  7759.         bsr    upper_case
  7760.         moveq    #$f,d1
  7761. seek_hex    cmp.b    (a1,d1.w),d0
  7762.         dbeq    d1,seek_hex
  7763.         tst.w    d1
  7764.         bmi.b    end_number
  7765.         lsl.l    #4,d2
  7766.         or.w    d1,d2
  7767.         sf    ok_numb
  7768.         bra.b    next_hex
  7769.  
  7770. end_number    subq.l    #1,a0
  7771.         move.l    d2,d0
  7772.         tst.b    minus
  7773.         beq.b    .no_minus
  7774.         neg.l    d0
  7775. .no_minus    tst.b    ok_numb        ;test if error
  7776.         movem.l    (a7)+,d1-d3/a1
  7777.         rts
  7778.  
  7779. check_label    movem.l    d1-d3/a1-a4,-(a7)
  7780.         move.l    a0,d3
  7781.         lea.l    label_list,a1
  7782.  
  7783.         moveq    #0,d2
  7784. .main        tst.b    (a1)
  7785.         beq.b    .end_list
  7786.         move.l    a0,a2
  7787.         move.l    a1,a3
  7788.         moveq    #8-1,d1
  7789. .do_cmp        move.b    (a2)+,d0
  7790.         bsr    upper_case
  7791.         cmp.b    (a3)+,d0
  7792.         bne.b    .no_egal
  7793.         tst.b    (a3)
  7794.         dbeq    d1,.do_cmp
  7795.         move.l    8(a1),d2
  7796.         move.l    a2,a4
  7797. .no_egal    lea.l    8+4(a1),a1
  7798.         bra.b    .main
  7799.  
  7800. .end_list    move.l    a4,a0            ;get end of label
  7801.         move.b    (a0),d0
  7802.         beq.b    .ok_label
  7803.         bsr    upper_case
  7804.         lea.l    .symb_list,a1
  7805. .seek        cmp.b    (a1)+,d0
  7806.         beq.b    .ok_label
  7807.         tst.b    (a1)
  7808.         bne.b    .seek
  7809.         moveq    #0,d2
  7810.         move.l    d3,a0
  7811. .ok_label    move.l    d2,d0
  7812.         movem.l    (a7)+,d1-d3/a1-a4
  7813.         rts
  7814.  
  7815. ;list of symbols which can follow a label.
  7816.  
  7817. .symb_list    dc.b $a,' ','+','-','*','/','&','|',')','.',']',0
  7818.         cnop 0,4
  7819.  
  7820. label_list
  7821.         dc.b "D0",0,0,0,0,0,0
  7822.         dc.l registres
  7823.         dc.b "D1",0,0,0,0,0,0
  7824.         dc.l registres+4
  7825.         dc.b "D2",0,0,0,0,0,0
  7826.         dc.l registres+2*4
  7827.         dc.b "D3",0,0,0,0,0,0
  7828.         dc.l registres+3*4
  7829.         dc.b "D4",0,0,0,0,0,0
  7830.         dc.l registres+4*4
  7831.         dc.b "D5",0,0,0,0,0,0
  7832.         dc.l registres+5*4
  7833.         dc.b "D6",0,0,0,0,0,0
  7834.         dc.l registres+6*4
  7835.         dc.b "D7",0,0,0,0,0,0
  7836.         dc.l registres+7*4
  7837.  
  7838.         dc.b "A0",0,0,0,0,0,0
  7839.         dc.l registres+8*4
  7840.         dc.b "A1",0,0,0,0,0,0
  7841.         dc.l registres+9*4
  7842.         dc.b "A2",0,0,0,0,0,0
  7843.         dc.l registres+10*4
  7844.         dc.b "A3",0,0,0,0,0,0
  7845.         dc.l registres+11*4
  7846.         dc.b "A4",0,0,0,0,0,0
  7847.         dc.l registres+12*4
  7848.         dc.b "A5",0,0,0,0,0,0
  7849.         dc.l registres+13*4
  7850.         dc.b "A6",0,0,0,0,0,0
  7851.         dc.l registres+14*4
  7852.         dc.b "A7",0,0,0,0,0,0
  7853.         dc.l registres+15*4
  7854.  
  7855.         dc.b "PC",0,0,0,0,0,0
  7856.         dc.l pc_reg
  7857.         dc.b "VBR",0,0,0,0,0
  7858.         dc.l vbr_reg
  7859.         dc.b "CACR",0,0,0,0
  7860.         dc.l cacr_reg
  7861.         dc.b "CAAR",0,0,0,0
  7862.         dc.l caar_reg
  7863.         dc.b "PCR",0,0,0,0,0
  7864.         dc.l msp_reg
  7865.         dc.b "BUSR",0,0,0,0
  7866.         dc.l caar_reg
  7867.         dc.b "ISP",0,0,0,0,0
  7868.         dc.l isp_reg
  7869.         dc.b "MSP",0,0,0,0,0
  7870.         dc.l msp_reg
  7871.  
  7872.         dc.b "EXEC",0,0,0,0
  7873.         dc.l $4
  7874.         dc.b "LEV3",0,0,0,0
  7875.         dc.l $6c
  7876.  
  7877.         dc.b 0
  7878.  
  7879.         cnop 0,4
  7880.  
  7881. ************************************************************
  7882.  
  7883. read_fact    cmp.b    #'(',(a0)
  7884.         bne.b    .no_parg
  7885.         addq.l    #1,a0
  7886.         bsr.w    read_expr
  7887.         cmp.b    #')',(a0)+
  7888.         bne.w    eval_error
  7889.         bra.b    end_fact
  7890. .no_parg    cmp.b    #'[',(a0)
  7891.         bne.b    .no_cro
  7892.         addq.l    #1,a0
  7893.         bsr.w    read_expr
  7894.         cmp.b    #']',(a0)+
  7895.         bne.w    eval_error
  7896.         move.l    d0,a4
  7897.         bsr    reloc_pic
  7898.         move.l    (a4),d0
  7899.         bra.b    end_fact
  7900. .no_cro        bsr    read_number
  7901.         bne.w    eval_error
  7902.  
  7903. end_fact    cmp.b    #'.',(a0)
  7904.         bne.b    .no_size
  7905.         addq.l    #1,a0            ;jmp .
  7906.         move.l    d1,-(a7)
  7907.         move.b    (a0)+,d1
  7908.         bsr    upper_case1
  7909.         cmp.b    #'B',d1
  7910.         bne.b    .no_b
  7911.         ext.w    d0
  7912.         ext.l    d0
  7913.         clr.w    eval_size
  7914.         bra.b    .end_size
  7915. .no_b        cmp.b    #'W',d1
  7916.         bne.b    .no_w
  7917.         ext.l    d0
  7918.         move.w    #1,eval_size
  7919.         bra.b    .end_size
  7920. .no_w        cmp.b    #'L',d1
  7921.         bne.w    eval_error
  7922.         move.w    #3,eval_size
  7923. .end_size    move.l    (a7)+,d1
  7924. .no_size    rts
  7925.  
  7926.  
  7927. read_terme    move.l    d1,-(a7)
  7928.         bsr.w    read_fact
  7929.         move.l    d0,d1
  7930. .loop        cmp.b    #'*',(a0)
  7931.         bne.b    .no_fois
  7932.         addq.l    #1,a0
  7933.         bsr.w    read_fact
  7934.         bsr.w    muls32
  7935.         bra.b    .loop
  7936. .no_fois    cmp.b    #'/',(a0)
  7937.         bne.b    .no_div
  7938.         addq.l    #1,a0
  7939.         bsr.w    read_fact
  7940.         bsr.w    divs32
  7941.         bra.b    .loop
  7942. .no_div        move.l    d1,d0
  7943.         move.l    (a7)+,d1
  7944.         rts
  7945.  
  7946. read_expr    move.l    d1,-(a7)
  7947.         cmp.b    #'+',(a0)
  7948.         bne.b    .no_p
  7949.         addq.l    #1,a0
  7950. .no_p        cmp.b    #'-',(a0)
  7951.         bne.b    .no_m
  7952.         addq.l    #1,a0
  7953.         bsr.b    read_terme
  7954.         neg.l    d0
  7955.         bra.b    .ok_m
  7956. .no_m        bsr.b    read_terme
  7957. .ok_m        move.l    d0,d1
  7958. .loop        cmp.b    #'+',(a0)
  7959.         bne.b    .no_plus
  7960.         addq.l    #1,a0
  7961.         bsr.b    read_terme
  7962.         add.l    d0,d1
  7963.         bra.b    .loop
  7964. .no_plus    cmp.b    #'-',(a0)
  7965.         bne.b    .no_moins
  7966.         addq.l    #1,a0
  7967.         bsr.b    read_terme
  7968.         sub.l    d0,d1
  7969.         bra.b    .loop
  7970. .no_moins    move.l    d1,d0
  7971.         move.l    (a7)+,d1
  7972.         rts
  7973.  
  7974. ;-> a0 =ptr on expr
  7975. ;<- d0 value
  7976. ;<- flag: zero=ok, negative=error, positive=no number
  7977.  
  7978. evaluate:    move.l    a7,exit_stack
  7979. .loop        cmp.b    #$20,(a0)+
  7980.         beq.b    .loop
  7981.         subq.l    #1,a0
  7982.         tst.b    (a0)
  7983.         beq.b    .no_eval
  7984.         bsr    read_expr
  7985.         tst.b    ok    ;zero = ok
  7986.         rts
  7987. .no_eval    tst.b    ok2
  7988.         rts
  7989. eval_error    move.l    exit_stack,a7
  7990.         moveq    #-1,d0        ;neg val = error
  7991.         rts
  7992.  
  7993. ok        dc.b 0
  7994. ok2        dc.b 1            ;positive val = no number
  7995.  
  7996. ;d0.l,d1.l
  7997. ;d1.l=d0.l*d1.l
  7998. muls32        movem.l    d0/d2/a0,-(a7)
  7999.         lea.l    muls_data,a0
  8000.         movem.l    d0-d1,(a0)
  8001.         swap    d0
  8002.         mulu    d0,d1
  8003.         move.w    d1,d2
  8004.         movem.l    (a0),d0-d1
  8005.         swap    d1
  8006.         mulu    d0,d1
  8007.         add.w    d1,d2
  8008.         swap    d2
  8009.         clr.w    d2
  8010.         movem.l    (a0),d0-d1
  8011.         mulu    d0,d1
  8012.         add.l    d2,d1
  8013.         movem.l    (a7)+,d0/d2/a0
  8014.         rts
  8015.  
  8016.  
  8017. ;d0.l,d1.l
  8018. ;d1.l=d1.l/d0.l
  8019. divs32        movem.l    d0/d2-d4/a0,-(a7)
  8020.         exg    d0,d1
  8021.         sf    d4
  8022.         tst.l    d0
  8023.         bpl.b    .n1
  8024.         neg.l    d0
  8025.         not.b    d4
  8026. .n1        tst.l    d1
  8027.         bpl.b    .n2
  8028.         neg.l    d1
  8029.         not.b    d4
  8030. .n2        move.l    #$ffff,d3
  8031.         lea.l    divs_data,a0
  8032.         movem.l    d0-d1,(a0)
  8033.         moveq    #0,d2
  8034.         cmp.l    #$10000,d1
  8035.         bge.b    .div2
  8036.  
  8037.         tst.w    d1
  8038.         beq.w    eval_error
  8039.  
  8040.         swap    d0
  8041.         and.l    d3,d0
  8042.         divu    d1,d0
  8043.         move.w    d0,d2
  8044.         swap    d2
  8045.         clr.w    d2
  8046.         move.w    2(a0),d0
  8047.         divu    d1,d0
  8048.         and.l    d3,d0
  8049.         add.l    d0,d2
  8050.         bra.b    .ok1
  8051.  
  8052. .div2        lsr.l    #1,d0
  8053.         lsr.l    #1,d1
  8054.         cmp.l    #$10000,d1
  8055.         bge.b    .div2
  8056.         tst.w    d1
  8057.         beq.w    eval_error
  8058.         divu    d1,d0
  8059.         move.w    d0,d2
  8060.         and.l    d3,d2
  8061.  
  8062. .ok1        tst.b    d4
  8063.         beq.b    .n3
  8064.         neg.l    d2
  8065. .n3        move.l    d2,d1
  8066.         movem.l    (a7)+,d0/d2-d4/a0
  8067.         rts
  8068.  
  8069. ************************************************************
  8070. ;-> a0=ptr on ascII registre
  8071. ;<- returns no of registre in d0 and end of ascII reg in a0
  8072.  
  8073. read_reg    movem.l    d1-d3/a1-a4,-(a7)
  8074.         move.l    a0,d3
  8075.         lea.l    reg_table,a1
  8076.  
  8077.         moveq    #-1,d2
  8078. .main        tst.b    (a1)
  8079.         beq.b    .end_list
  8080.         move.l    a0,a2
  8081.         move.l    a1,a3
  8082.         moveq    #4-1,d1
  8083. .do_cmp        move.b    (a2)+,d0
  8084.         bsr    upper_case
  8085.         cmp.b    (a3)+,d0
  8086.         bne.b    .no_egal
  8087.         tst.b    (a3)
  8088.         dbeq    d1,.do_cmp
  8089.         move.w    4(a1),d2
  8090.         move.l    a2,a4
  8091. .no_egal    lea.l    4+2(a1),a1
  8092.         bra.b    .main
  8093.  
  8094. .end_list    move.l    a4,a0            ;get end of register
  8095.         move.w    d2,d0
  8096.         movem.l    (a7)+,d1-d3/a1-a4
  8097.         rts
  8098.  
  8099. reg_table
  8100.         dc.b "D0",0,0
  8101.         dc.w 0
  8102.         dc.b "D1",0,0
  8103.         dc.w 1
  8104.         dc.b "D2",0,0
  8105.         dc.w 2
  8106.         dc.b "D3",0,0
  8107.         dc.w 3
  8108.         dc.b "D4",0,0
  8109.         dc.w 4
  8110.         dc.b "D5",0,0
  8111.         dc.w 5
  8112.         dc.b "D6",0,0
  8113.         dc.w 6
  8114.         dc.b "D7",0,0
  8115.         dc.w 7
  8116.         dc.b "A0",0,0
  8117.         dc.w 8
  8118.         dc.b "A1",0,0
  8119.         dc.w 9
  8120.         dc.b "A2",0,0
  8121.         dc.w 10
  8122.         dc.b "A3",0,0
  8123.         dc.w 11
  8124.         dc.b "A4",0,0
  8125.         dc.w 12
  8126.         dc.b "A5",0,0
  8127.         dc.w 13
  8128.         dc.b "A6",0,0
  8129.         dc.w 14
  8130.         dc.b "A7",0,0
  8131.         dc.w 15
  8132.         dc.b "PC",0,0
  8133.         dc.w 16
  8134.         dc.b "SR",0,0
  8135.         dc.w 17
  8136.         dc.b "VBR",0
  8137.         dc.w 18
  8138.         dc.b "USP",0
  8139.         dc.w 19
  8140.         dc.b "SSP",0
  8141.         dc.w 20
  8142.         dc.b "CACR"
  8143.         dc.w 21
  8144.         dc.b "PCR",0
  8145.         dc.w 22
  8146.         dc.b "BUSR"
  8147.         dc.w 23
  8148.         dc.w 0
  8149.  
  8150.  
  8151. ************************************************************
  8152. ;-------------- Run-length packing -------------------------
  8153.  
  8154. ;-> a0=ptr on source mem to pack
  8155. ;-> a1=destination mem
  8156. ;-> d0.w=size to pack
  8157. ;<- d0.w=packed size
  8158.  
  8159. pack        movem.l    d1-d6/a0-a4,-(a7)
  8160.         move.w    #$100,$dff096        ;disable bitplan DMA
  8161.  
  8162.         move.w    #0,$dff106
  8163.         move.l    a1,a4
  8164.         lea.l    8(a4),a2
  8165.         move.l    d0,4(a4)
  8166.  
  8167.         move.l    a0,a3
  8168.         move.l    d0,d3            ;d3=original size
  8169.  
  8170.         move.l    d0,d5            ;d5=nb of bytes still to pack
  8171.  
  8172. .loop        move.l    d5,d6
  8173.         cmp.l    #128,d6
  8174.         ble.b    .min
  8175.         moveq    #127,d6
  8176.         addq.l    #1,d6            ;d6=128
  8177. .min
  8178.         move.l    d6,d0
  8179.         subq.l    #1,d0            ;d6=1 ?
  8180.         bne.b    .no1
  8181.         move.b    (a0)+,(a2)+
  8182.         sf    (a2)+
  8183.         bra.b    .end
  8184. .no1
  8185.         move.b    (a0)+,d0
  8186.         move.b    d0,$dff180
  8187.         move.b    (a0)+,d1
  8188.         cmp.b    d0,d1
  8189.         bne.b    .diff
  8190.  
  8191.         moveq    #1,d4
  8192.         subq.l    #1,d6
  8193.  
  8194. .cntsame    addq.l    #1,d4
  8195.         subq.l    #1,d6
  8196.         beq.b    .out2
  8197.         cmp.b    (a0)+,d0
  8198.         beq.b    .cntsame
  8199.         subq.l    #1,a0
  8200. .out2
  8201.         sub.l    d4,d5
  8202.         neg.w    d4
  8203.         move.b    d0,(a2)+
  8204.         move.b    d4,(a2)+
  8205.         tst.l    d5
  8206.         beq.b    .end
  8207.         bra.b    .loop
  8208.  
  8209. ;---------------------------------
  8210. .diff        lea.l    -2(a0),a1
  8211.         moveq    #0,d4
  8212. .cntdiff    move.b    d1,d0
  8213.         addq.l    #1,d4
  8214.         subq.l    #1,d6
  8215.         beq.b    .out
  8216.         move.b    (a0)+,d1
  8217.         cmp.b    d0,d1
  8218.         bne.b    .cntdiff
  8219.         subq.l    #1,a0
  8220.  
  8221. .out        subq.l    #1,a0
  8222.         sub.l    d4,d5
  8223.         subq.l    #1,d4
  8224.         move.w    d4,d0
  8225. .copy        move.b    (a1)+,(a2)+
  8226.         dbf    d4,.copy
  8227.         move.b    d0,(a2)+
  8228.         tst.l    d5            ;end of block ?
  8229.         bne.b    .loop
  8230.  
  8231. .end        move.l    a2,d0
  8232.         lea.l    8(a4),a1
  8233.         sub.l    a1,d0            ;d0=packed size
  8234.         move.l    d0,(a4)            ;first long=packed size
  8235.         cmp.l    d0,d3
  8236.         bgt.b    .pack
  8237.         lea.l    8(a4),a1
  8238.         move.l    d3,d0
  8239.         neg.l    d0
  8240.         move.l    d0,(a4)
  8241.         move.l    d3,d0
  8242.         move.b    d3,d1
  8243.         lsr.l    #2,d3
  8244. .copyl        move.l    (a3)+,(a1)+        ;copy unpacked area
  8245.         subq.l    #1,d3
  8246.         bne.b    .copyl
  8247.         and.w    #3,d1
  8248.         bra.b    .godbf
  8249. .copyb        move.b    (a3)+,(a1)+
  8250. .godbf        dbf    d1,.copyb
  8251. .pack
  8252.         addq.l    #8,d0            ;for first long=size
  8253.  
  8254.         move.w    #0,$dff106
  8255.         move.w    #0,$dff180
  8256.         move.w    #$8100,$dff096        ;enable bitplan DMA
  8257.  
  8258.         movem.l    (a7)+,d1-d6/a0-a4
  8259.         rts
  8260.  
  8261. ;----------------------------------------------------------
  8262.  
  8263. ;-> a0=ptr on packed mem
  8264. ;-> a1=ptr on dest mem
  8265.  
  8266. depack        movem.l    d0-d1/a0-a2,-(a7)
  8267.         move.w    #0,$dff106
  8268.         move.w    #$100,$dff096        ;disable bitplan DMA
  8269.  
  8270.         tst.l    (a0)
  8271.         bmi.b    .nopack
  8272.         movem.l    (a0)+,d0-d1
  8273.         move.l    a0,a2
  8274.         add.l    d0,a0
  8275.         add.l    d1,a1
  8276.  
  8277. .loop        cmp.l    a2,a0
  8278.         beq.b    .end
  8279.         moveq    #0,d0
  8280.         move.b    -(a0),d0
  8281.         bmi.b    .neg
  8282. .copy        move.b    -(a0),-(a1)
  8283.         dbf    d0,.copy
  8284.         move.b    (a1),$dff180
  8285.         bra.b    .loop
  8286. .neg        ext.w    d0
  8287.         not.w    d0
  8288.         move.b    -(a0),d1
  8289.         move.b    d1,$dff180
  8290. .fill        move.b    d1,-(a1)
  8291.         dbf    d0,.fill
  8292.         bra.b    .loop
  8293.  
  8294. .nopack        addq.l    #8,a0
  8295.         move.l    4(a0),d0
  8296.         move.b    d0,d1
  8297.         lsr.l    #2,d0
  8298. .copyl        move.l    (a0)+,(a1)+
  8299.         subq.l    #1,d0
  8300.         bne.b    .copyl
  8301.         and.w    #3,d1
  8302.         bra.b    .godbf
  8303. .copyb        move.b    (a0)+,(a1)+
  8304. .godbf        dbf    d1,.copyb
  8305.  
  8306. .end
  8307.         move.w    #0,$dff106
  8308.         move.w    #0,$dff180
  8309.         move.w    #$8100,$dff096        ;enable bitplan DMA
  8310.  
  8311.         movem.l    (a7)+,d0-d1/a0-a2
  8312.         rts
  8313.  
  8314. ************************************************************
  8315.  
  8316. ;a0=ptr on text
  8317.  
  8318. print_curs    bsr    clear_cursor    ;special print which clears cursor
  8319.         clr.w    cursor_x    ;and set it to x=0
  8320.         bsr.b    print
  8321.         bsr    set_cursor
  8322.         rts
  8323.  
  8324.  
  8325. print:        movem.l    d0-d2/a0-a4,-(a7)
  8326.         move.l    output_ptr,d0
  8327.         beq.b    .noout
  8328.         move.l    a0,a1
  8329.         move.l    d0,a2
  8330. .copy        move.b    (a1)+,(a2)+
  8331.         bne.b    .copy
  8332.         subq.l    #1,a2
  8333.         move.l    a2,output_ptr
  8334. ;        move.l    a2,watch2
  8335.  
  8336. .noout        move.w    window_bot,d2
  8337.         lea.l    cursor_x,a3
  8338.         move.w    2(a3),d0
  8339.         cmp.w    window_top,d0
  8340.         bge.b    .ok1
  8341.         move.w    window_top,d0
  8342. .ok1        cmp.w    window_bot,d0
  8343.         blt.b    .ok2
  8344.         move.w    window_bot,d0
  8345. .ok2        move.w    d0,2(a3)
  8346.  
  8347.         move.l    ascII_ptr,a2
  8348.         lea.l    print_cnt,a4
  8349.         clr.w    (a4)
  8350.  
  8351. print_next
  8352. go_print    tst.b    break
  8353.         bne.w    end_print
  8354.         move.w    2(a3),d0
  8355.         mulu    #80,d0
  8356.         lea.l    (a2,d0.l),a1
  8357.         add.w    (a3),a1
  8358.  
  8359.         move.b    (a0)+,d0
  8360.         beq.b    end_printl
  8361.         cmp.b    #$0a,d0
  8362.         beq.b    end_printl
  8363.         cmp.b    #9,d0
  8364.         bne.b    .no_tab
  8365.         move.w    (a3),d0
  8366.         and.w    #$fff8,d0
  8367.         addq.w    #8,d0
  8368.         move.w    d0,(a3)
  8369.         bra.b    go_print
  8370. .no_tab        cmp.b    #$0d,d0
  8371.         bne.b    .no_13
  8372.         clr.w    (a3)
  8373.         bra.b    go_print
  8374.  
  8375. .no_13        move.b    d0,(a1)
  8376.  
  8377.         addq.w    #1,(a3)
  8378.         cmp.w    #80,(a3)
  8379.         blt.b    .ok
  8380.         clr.w    (a3)
  8381.         move.w    2(a3),d0
  8382.         bsr    print_line
  8383.         addq.w    #1,(a4)
  8384.         cmp.w    (a4),d2
  8385.         bgt.b    .okp
  8386.         bsr.b    print_wait
  8387. .okp        cmp.w    2(a3),d2
  8388.         bgt.b    .ok_cr_prt
  8389.         subq.w    #1,2(a3)
  8390.         bsr    scroll_up
  8391. .ok_cr_prt    addq.w    #1,2(a3)
  8392. .ok
  8393.         bra.b    go_print
  8394.  
  8395. end_printl    tst.b    d0
  8396.         beq.b    end_print
  8397. ;-------------- print CR -------------------
  8398.         move.w    2(a3),d0
  8399.         bsr    print_line
  8400.         addq.w    #1,(a4)
  8401.         cmp.w    (a4),d2
  8402.         bgt.b    .okp
  8403.         bsr.b    print_wait
  8404. .okp        clr.w    (a3)
  8405.         cmp.w    2(a3),d2
  8406.         bgt.b    .ok_cr_prt
  8407.         subq.w    #1,2(a3)
  8408.         bsr    scroll_up
  8409. .ok_cr_prt    addq.w    #1,2(a3)
  8410.         tst.b    (a0)
  8411.         beq.b    end_print_out
  8412.         bra.w    print_next
  8413. ;-------------------------------------------
  8414. end_print    move.w    2(a3),d0
  8415.         bsr    print_line
  8416. end_print_out
  8417.         movem.l    (a7)+,d0-d2/a0-a4
  8418.         rts
  8419.  
  8420. print_wait    tst.b    no_print
  8421.         bne.b    .nowait
  8422.         clr.w    (a4)
  8423.         st    new_key
  8424. .wait        move.w    #15,time_cursor
  8425.         tst.b    new_key
  8426.         bne.b    .wait
  8427. .nowait        rts
  8428.  
  8429. ************************************************************
  8430.  
  8431. no_sc_clr    dc.b 0
  8432.         even
  8433.  
  8434. scroll_up    move.l    d2,-(a7)
  8435.         moveq    #1,d2
  8436.         bsr.b    scroll_up2
  8437.         move.l    (a7)+,d2
  8438.         rts
  8439.  
  8440. ;-> d2 = nb of lines
  8441.  
  8442. scroll_up2    movem.l    d0-d1/a0-a1,-(a7)
  8443.         move.l    ascII_ptr,a0
  8444.         move.w    window_top,d0
  8445.         mulu    #80,d0
  8446.         add.l    d0,a0
  8447.         move.w    d2,d0
  8448.         mulu    #80,d0
  8449.         lea.l    (a0,d0.l),a1
  8450.         move.w    window_bot,d0
  8451.         sub.w    window_top,d0
  8452.         sub.w    d2,d0
  8453.         addq.w    #1,d0
  8454.         bra.b    .go_dbf
  8455. .ascII_up    move.l    (a1)+,(a0)+
  8456.         move.l    (a1)+,(a0)+
  8457.         move.l    (a1)+,(a0)+
  8458.         move.l    (a1)+,(a0)+
  8459.         move.l    (a1)+,(a0)+
  8460.         move.l    (a1)+,(a0)+
  8461.         move.l    (a1)+,(a0)+
  8462.         move.l    (a1)+,(a0)+
  8463.         move.l    (a1)+,(a0)+
  8464.         move.l    (a1)+,(a0)+
  8465.         move.l    (a1)+,(a0)+
  8466.         move.l    (a1)+,(a0)+
  8467.         move.l    (a1)+,(a0)+
  8468.         move.l    (a1)+,(a0)+
  8469.         move.l    (a1)+,(a0)+
  8470.         move.l    (a1)+,(a0)+
  8471.         move.l    (a1)+,(a0)+
  8472.         move.l    (a1)+,(a0)+
  8473.         move.l    (a1)+,(a0)+
  8474.         move.l    (a1)+,(a0)+
  8475. .go_dbf        dbf    d0,.ascII_up
  8476.         move.l    #'    ',d0
  8477.         moveq    #5,d1
  8478.         mulu    d2,d1
  8479.         subq.w    #1,d1
  8480. .clear_up    move.l    d0,(a0)+
  8481.         move.l    d0,(a0)+
  8482.         move.l    d0,(a0)+
  8483.         move.l    d0,(a0)+
  8484.         dbf    d1,.clear_up
  8485.  
  8486.         tst.b    no_print
  8487.         bne.w    .noscroll
  8488.  
  8489.         move.l    pic_ptr,a0
  8490.         move.w    window_top,d0
  8491.         mulu    #80*h,d0
  8492.         add.l    d0,a0
  8493.         move.w    d2,d0
  8494.         mulu    #80*h,d0
  8495.         lea.l    (a0,d0.l),a1
  8496.         move.w    window_bot,d0
  8497.         sub.w    window_top,d0
  8498.         sub.w    d2,d0
  8499.         addq.w    #1,d0
  8500.         mulu    #h,d0
  8501.         bra.b    .go_dbf2
  8502. .pixel_up    move.l    (a1)+,(a0)+
  8503.         move.l    (a1)+,(a0)+
  8504.         move.l    (a1)+,(a0)+
  8505.         move.l    (a1)+,(a0)+
  8506.         move.l    (a1)+,(a0)+
  8507.         move.l    (a1)+,(a0)+
  8508.         move.l    (a1)+,(a0)+
  8509.         move.l    (a1)+,(a0)+
  8510.         move.l    (a1)+,(a0)+
  8511.         move.l    (a1)+,(a0)+
  8512.         move.l    (a1)+,(a0)+
  8513.         move.l    (a1)+,(a0)+
  8514.         move.l    (a1)+,(a0)+
  8515.         move.l    (a1)+,(a0)+
  8516.         move.l    (a1)+,(a0)+
  8517.         move.l    (a1)+,(a0)+
  8518.         move.l    (a1)+,(a0)+
  8519.         move.l    (a1)+,(a0)+
  8520.         move.l    (a1)+,(a0)+
  8521.         move.l    (a1)+,(a0)+
  8522. .go_dbf2    dbf    d0,.pixel_up
  8523.  
  8524.         moveq    #0,d0
  8525.         tst.b    no_sc_clr
  8526.         beq.b    .goclr
  8527.         move.w    d2,d1
  8528.         subq.w    #1,d1
  8529.         mulu    #80*h,d1
  8530.         add.l    d1,a0
  8531.         moveq    #5*h-1,d1
  8532.         bra.b    .clear_pix_up
  8533. .goclr        move.w    d2,d1
  8534.         mulu    #5*h,d1
  8535.         subq.w    #1,d1
  8536. .clear_pix_up    move.l    d0,(a0)+
  8537.         move.l    d0,(a0)+
  8538.         move.l    d0,(a0)+
  8539.         move.l    d0,(a0)+
  8540.         dbf    d1,.clear_pix_up
  8541.  
  8542. .noscroll    movem.l    (a7)+,d0-d1/a0-a1
  8543.         rts
  8544.  
  8545. ;-------------------------------------------
  8546.  
  8547. scroll_down    move.l    d2,-(a7)
  8548.         moveq    #1,d2
  8549.         bsr.b    scroll_down2
  8550.         move.l    (a7)+,d2
  8551.         rts
  8552.  
  8553. ;-> d2 = nb of lines
  8554.  
  8555. scroll_down2    movem.l    d0-d1/a0-a1,-(a7)
  8556.  
  8557.         move.l    ascII_ptr,a0
  8558.         move.w    window_bot,d0
  8559.         mulu    #80,d0
  8560.         add.l    d0,a0
  8561.         move.l    a0,a1
  8562.         move.w    d2,d0
  8563.         subq.w    #1,d0
  8564.         mulu    #80,d0
  8565.         sub.l    d0,a1
  8566.         lea.l    80(a0),a0
  8567.         move.w    window_bot,d0
  8568.         sub.w    window_top,d0
  8569.         sub.w    d2,d0
  8570.         addq.w    #1,d0
  8571.         bra.b    .go_dbf
  8572. .ascII_down    move.l    -(a1),-(a0)
  8573.         move.l    -(a1),-(a0)
  8574.         move.l    -(a1),-(a0)
  8575.         move.l    -(a1),-(a0)
  8576.         move.l    -(a1),-(a0)
  8577.         move.l    -(a1),-(a0)
  8578.         move.l    -(a1),-(a0)
  8579.         move.l    -(a1),-(a0)
  8580.         move.l    -(a1),-(a0)
  8581.         move.l    -(a1),-(a0)
  8582.         move.l    -(a1),-(a0)
  8583.         move.l    -(a1),-(a0)
  8584.         move.l    -(a1),-(a0)
  8585.         move.l    -(a1),-(a0)
  8586.         move.l    -(a1),-(a0)
  8587.         move.l    -(a1),-(a0)
  8588.         move.l    -(a1),-(a0)
  8589.         move.l    -(a1),-(a0)
  8590.         move.l    -(a1),-(a0)
  8591.         move.l    -(a1),-(a0)
  8592. .go_dbf        dbf    d0,.ascII_down
  8593.         move.l    #'    ',d0
  8594.         move.w    d2,d1
  8595.         mulu    #5,d1
  8596.         subq.w    #1,d1
  8597. .clear_down    move.l    d0,-(a0)
  8598.         move.l    d0,-(a0)
  8599.         move.l    d0,-(a0)
  8600.         move.l    d0,-(a0)
  8601.         dbf    d1,.clear_down
  8602.  
  8603.         tst.b    no_print
  8604.         bne.w    .noscroll
  8605.  
  8606.         move.l    pic_ptr,a0
  8607.         move.w    window_bot,d0
  8608.         mulu    #80*h,d0
  8609.         add.l    d0,a0
  8610.         move.l    a0,a1
  8611.         move.w    d2,d0
  8612.         subq.w    #1,d0
  8613.         mulu    #80*h,d0
  8614.         sub.l    d0,a1
  8615.         lea.l    80*h(a0),a0
  8616.  
  8617.         move.w    window_bot,d0
  8618.         sub.w    window_top,d0
  8619.         sub.w    d2,d0
  8620.         addq.w    #1,d0
  8621.         mulu    #h,d0
  8622.         bra.b    .go_dbf2
  8623. .pixel_down    move.l    -(a1),-(a0)
  8624.         move.l    -(a1),-(a0)
  8625.         move.l    -(a1),-(a0)
  8626.         move.l    -(a1),-(a0)
  8627.         move.l    -(a1),-(a0)
  8628.         move.l    -(a1),-(a0)
  8629.         move.l    -(a1),-(a0)
  8630.         move.l    -(a1),-(a0)
  8631.         move.l    -(a1),-(a0)
  8632.         move.l    -(a1),-(a0)
  8633.         move.l    -(a1),-(a0)
  8634.         move.l    -(a1),-(a0)
  8635.         move.l    -(a1),-(a0)
  8636.         move.l    -(a1),-(a0)
  8637.         move.l    -(a1),-(a0)
  8638.         move.l    -(a1),-(a0)
  8639.         move.l    -(a1),-(a0)
  8640.         move.l    -(a1),-(a0)
  8641.         move.l    -(a1),-(a0)
  8642.         move.l    -(a1),-(a0)
  8643. .go_dbf2    dbf    d0,.pixel_down
  8644.  
  8645.         moveq    #0,d0
  8646.         tst.b    no_sc_clr
  8647.         beq.b    .goclr
  8648.         move.w    d2,d1
  8649.         subq.w    #1,d1
  8650.         mulu    #80*h,d1
  8651.         sub.l    d1,a0
  8652.         moveq    #5*h-1,d1
  8653.         bra.b    .clear_pix_down
  8654. .goclr        move.w    d2,d1
  8655.         mulu    #5*h,d1
  8656.         subq.w    #1,d1
  8657. .clear_pix_down    move.l    d0,-(a0)
  8658.         move.l    d0,-(a0)
  8659.         move.l    d0,-(a0)
  8660.         move.l    d0,-(a0)
  8661.         dbf    d1,.clear_pix_down
  8662.  
  8663. .noscroll    movem.l    (a7)+,d0-d1/a0-a1
  8664.         rts
  8665.  
  8666. ************************************************************
  8667.  
  8668. ;d0=no of line
  8669.  
  8670. print_line    movem.l    d0-d4/a0-a4,-(a7)
  8671.         tst.b    no_print
  8672.         bne.w    .no_print
  8673.  
  8674.         move.l    ascII_ptr,a0
  8675.         mulu    #80,d0
  8676.         add.l    d0,a0
  8677.         move.l    pic_ptr,a1
  8678.         mulu    #h,d0
  8679.         add.l    d0,a1
  8680.  
  8681.         lea.l    topaz2,a3
  8682.         lea.l    ascII_conv,a4
  8683.         moveq    #80-1,d4
  8684.         moveq    #0,d2
  8685.         moveq    #0,d0
  8686.  
  8687. .do_line_prt    move.b    (a0)+,d2
  8688.  
  8689.         move.b    (a4,d2.w),d0
  8690.         lea.l    (a3,d0.w),a2
  8691.  
  8692.         move.b    110(a2),80(a1)
  8693.         move.b    220(a2),160(a1)
  8694.         move.b    330(a2),240(a1)
  8695.         move.b    440(a2),320(a1)
  8696.         move.b    550(a2),400(a1)
  8697.         move.b    660(a2),480(a1)
  8698.         move.b    770(a2),560(a1)
  8699.         move.b    880(a2),640(a1)
  8700.         move.b    (a2),(a1)+
  8701.  
  8702.         dbf    d4,.do_line_prt
  8703.  
  8704. .stop_print    move.w    #15,time_cursor
  8705.         btst    #10-8,$dff016
  8706.         beq.b    .stop_print
  8707.  
  8708. .no_print    movem.l    (a7)+,d0-d4/a0-a4
  8709.         rts
  8710.  
  8711. ;---------------------------------------------------
  8712.  
  8713. ;d0=x pos
  8714. ;d1=y pos
  8715. ;d2=ascII char
  8716.  
  8717. print_char    movem.l    d0-d2/a1-a2,-(a7)
  8718.         move.l    ascII_ptr,a1
  8719.         add.w    d0,a1
  8720.         lsl.w    #4,d1
  8721.         move.w    d1,a2
  8722.         add.w    d1,d1
  8723.         add.w    d1,d1
  8724.         add.w    a2,d1            ;d1*80
  8725.         move.b    d2,(a1,d1.w)
  8726.  
  8727.         and.w    #$ff,d2
  8728.  
  8729.         lea.l    ascII_conv,a2
  8730.         move.b    (a2,d2.w),d2
  8731.         lea.l    topaz2,a2
  8732.         lea.l    (a2,d2.w),a2
  8733.  
  8734.         move.l    pic_ptr,a1
  8735.         add.w    d0,a1
  8736.         mulu    #h,d1
  8737.         add.l    d1,a1
  8738.         move.b    (a2),(a1)
  8739.         move.b    110(a2),80(a1)
  8740.         move.b    220(a2),160(a1)
  8741.         move.b    330(a2),240(a1)
  8742.         move.b    440(a2),320(a1)
  8743.         move.b    550(a2),400(a1)
  8744.         move.b    660(a2),480(a1)
  8745.         move.b    770(a2),560(a1)
  8746.         move.b    880(a2),640(a1)
  8747.         movem.l    (a7)+,d0-d2/a1-a2
  8748.         rts
  8749.  
  8750.  
  8751. ;d0=x pos
  8752. ;d1=y pos
  8753. ;d2=ascII char
  8754.  
  8755. ;print on all screens
  8756.  
  8757. print_char2    movem.l    d0-d2/a1-a3,-(a7)
  8758.         lsl.w    #4,d1
  8759.         move.w    d1,a2
  8760.         add.w    d1,d1
  8761.         add.w    d1,d1
  8762.         add.w    a2,d1            ;d1*80
  8763.         add.w    d0,d1
  8764.         lea.l    ascII_ptr+4,a1
  8765. .loop        tst.l    (a1)
  8766.         beq.b    .end_ascII
  8767.         move.l    (a1)+,a3
  8768.         move.b    d2,(a3,d1.w)
  8769.         bra.b    .loop
  8770.  
  8771. .end_ascII    and.w    #$ff,d2
  8772.  
  8773.         lea.l    ascII_conv,a2
  8774.         move.b    (a2,d2.w),d2
  8775.         lea.l    topaz2,a2
  8776.         lea.l    (a2,d2.w),a2
  8777.  
  8778.         sub.w    d0,d1
  8779.  
  8780.         move.l    pic_ptr,a1
  8781.         add.w    d0,a1
  8782.         mulu    #h,d1
  8783.         add.l    d1,a1
  8784.         move.b    (a2),(a1)
  8785.         move.b    110(a2),80(a1)
  8786.         move.b    220(a2),160(a1)
  8787.         move.b    330(a2),240(a1)
  8788.         move.b    440(a2),320(a1)
  8789.         move.b    550(a2),400(a1)
  8790.         move.b    660(a2),480(a1)
  8791.         move.b    770(a2),560(a1)
  8792.         move.b    880(a2),640(a1)
  8793.         movem.l    (a7)+,d0-d2/a1-a3
  8794.         rts
  8795.  
  8796. do_cursor:    bsr    clear_snap
  8797.         tst.b    no_curs
  8798.         bne.w    .no_cur
  8799.  
  8800.         movem.l    d0-a6,-(a7)
  8801.         lea.l    $dff000,a6
  8802.         bsr    init_mouse
  8803.         move.w    x_spr,d0
  8804.         bpl.b    .ok1
  8805.         clr.w    d0
  8806. .ok1        cmp.w    #640,d0
  8807.         blt.b    .ok2
  8808.         move.w    #639,d0
  8809. .ok2        move.w    d0,x_spr
  8810.         lsr    #3,d0
  8811.         move.w    d0,snap_x
  8812.         move.w    y_spr,d0
  8813.         bpl.b    .ok3
  8814.         clr.w    d0
  8815. .ok3        move.w    screen_height,d1
  8816.         mulu    #9,d1
  8817.         cmp.w    d1,d0
  8818.         blt.b    .ok4
  8819.         move.w    d1,d0
  8820.         subq.w    #1,d0
  8821. .ok4        move.w    d0,y_spr
  8822.         ext.l    d0
  8823.         divu    #9,d0
  8824.         move.w    d0,snap_y
  8825.         bsr    set_snap
  8826.  
  8827.         tst.b    nosnap
  8828.         bne.w    .nos
  8829.         tst.b    left
  8830.         beq.w    .noleft
  8831.         move.l    ascII_ptr,a0
  8832.         move.w    snap_y,d0
  8833.         mulu    #80,d0
  8834.         add.l    d0,a0
  8835.         move.w    snap_x,d0
  8836.         cmp.b    #$20,(a0,d0.w)
  8837.         beq.b    .noleft
  8838. .redeb        tst.w    d0
  8839.         beq.b    .debs
  8840.         cmp.b    #$20,-1(a0,d0.w)
  8841.         beq.b    .debs
  8842.         cmp.b    #';',-1(a0,d0.w)
  8843.         beq.b    .debs
  8844.         cmp.b    #'=',-1(a0,d0.w)
  8845.         beq.b    .debs
  8846.         cmp.b    #'(',-1(a0,d0.w)
  8847.         beq.b    .debs
  8848.         cmp.b    #',',-1(a0,d0.w)
  8849.         beq.b    .debs
  8850.         subq.w    #1,d0
  8851.         bra.b    .redeb
  8852. .debs
  8853.         lea.l    snap_buf,a1
  8854. .cops        move.b    (a0,d0.w),(a1)+
  8855.         addq.w    #1,d0
  8856.         cmp.w    #80,d0
  8857.         beq.b    .ends
  8858.         cmp.b    #',',(a0,d0.w)
  8859.         beq.b    .ends
  8860.         cmp.b    #';',(a0,d0.w)
  8861.         beq.b    .ends
  8862.         cmp.b    #')',(a0,d0.w)
  8863.         beq.b    .ends
  8864.         cmp.b    #$20,(a0,d0.w)
  8865.         bne.b    .cops
  8866. .ends        sf    (a1)
  8867.  
  8868. .noleft
  8869. .nos
  8870.         movem.l    (a7)+,d0-a6
  8871.  
  8872.         subq.w    #1,time_cursor
  8873.         bpl.b    no_cursor
  8874.         sf    nosnap
  8875.         move.w    #15,time_cursor
  8876.         bsr.b    set_cursor
  8877. .no_cur        rts
  8878.  
  8879. set_cursor:    movem.l    d0/a0,-(a7)
  8880.         move.l    pic_ptr,a0
  8881.         add.w    cursor_x,a0
  8882.         move.w    cursor_y,d0
  8883.         mulu    #80*h,d0
  8884.         add.l    d0,a0
  8885.         not.b    cursor_on
  8886.         tst.b    no_print
  8887.         bne.b    .no
  8888.         not.b    (a0)
  8889.         not.b    80(a0)
  8890.         not.b    160(a0)
  8891.         not.b    240(a0)
  8892.         not.b    320(a0)
  8893.         not.b    400(a0)
  8894.         not.b    480(a0)
  8895.         not.b    560(a0)
  8896. .no        movem.l    (a7)+,d0/a0
  8897. no_cursor    rts
  8898.  
  8899. clear_cursor:    movem.l    d0/a0,-(a7)
  8900.         st    nosnap
  8901.         bsr    clear_snap
  8902.  
  8903.         move.w    #15,time_cursor
  8904.         move.l    pic_ptr,a0
  8905.         add.w    cursor_x,a0
  8906.         move.w    cursor_y,d0
  8907.         mulu    #80*h,d0
  8908.         add.l    d0,a0
  8909.         tst.b    cursor_on
  8910.         beq.b    no_clear_curs
  8911.         tst.b    no_print
  8912.         bne.b    .no
  8913.         not.b    (a0)
  8914.         not.b    80(a0)
  8915.         not.b    160(a0)
  8916.         not.b    240(a0)
  8917.         not.b    320(a0)
  8918.         not.b    400(a0)
  8919.         not.b    480(a0)
  8920.         not.b    560(a0)
  8921. .no
  8922. no_clear_curs    sf    cursor_on
  8923.         movem.l    (a7)+,d0/a0
  8924.         rts
  8925.  
  8926. snap_x:        dc.w 40
  8927. snap_y:        dc.w 10
  8928. snap_buf:    dcb.b 84,0
  8929. snap:        dc.b 0
  8930. nosnap:        dc.b 0
  8931.         even
  8932.  
  8933. clear_snap:    movem.l    d0-d2/a0,-(a7)
  8934.         move.w    sr,d2
  8935.         move.w    #$2700,sr
  8936.         tst.b    snap
  8937.         beq.b    .snapoff
  8938.         sf    snap
  8939.         move.l    pic_ptr,a0
  8940.         add.w    snap_x,a0
  8941.         move.w    snap_y,d0
  8942.         mulu    #80*h,d0
  8943.         add.l    d0,a0
  8944.         move.b    #$55,d0
  8945.         move.b    #$aa,d1
  8946.         eor.b    d0,(a0)
  8947.         eor.b    d1,80(a0)
  8948.         eor.b    d0,160(a0)
  8949.         eor.b    d1,240(a0)
  8950.         eor.b    d0,320(a0)
  8951.         eor.b    d1,400(a0)
  8952.         eor.b    d0,480(a0)
  8953.         eor.b    d1,560(a0)
  8954. .snapoff    move.w    d2,sr
  8955.         movem.l    (a7)+,d0-d2/a0
  8956.         rts
  8957.  
  8958. set_snap:    movem.l    d0-d2/a0,-(a7)
  8959.         tst.b    nosnap
  8960.         bne.b    .nosnap
  8961.         move.w    sr,d2
  8962.         move.w    #$2700,sr
  8963.         tst.b    snap
  8964.         bne.b    .snapon
  8965.         st    snap
  8966.         move.l    pic_ptr,a0
  8967.         add.w    snap_x,a0
  8968.         move.w    snap_y,d0
  8969.         mulu    #80*h,d0
  8970.         add.l    d0,a0
  8971.         move.b    #$55,d0
  8972.         move.b    #$aa,d1
  8973.         eor.b    d0,(a0)
  8974.         eor.b    d1,80(a0)
  8975.         eor.b    d0,160(a0)
  8976.         eor.b    d1,240(a0)
  8977.         eor.b    d0,320(a0)
  8978.         eor.b    d1,400(a0)
  8979.         eor.b    d0,480(a0)
  8980.         eor.b    d1,560(a0)
  8981. .snapon        move.w    d2,sr
  8982. .nosnap        movem.l    (a7)+,d0-d2/a0
  8983.         rts
  8984.  
  8985. ;-------------- Print an hex number -------------------
  8986.  
  8987. ;-> d0=hex number
  8988. ;-> d1=nb ascIIs (length of hex number)
  8989.  
  8990. print_hex    move.l    a0,-(a7)
  8991.         lea.l    general_txt,a0
  8992.         bsr.w    conv_hex
  8993.         sf    (a0,d1.w)        ;set end CHAR
  8994.         bsr    print
  8995.         move.l    (a7)+,a0
  8996.         rts
  8997.  
  8998. ;-------------- Print an hex number followed by a CR -
  8999.  
  9000. ;-> d0=hex number
  9001. ;-> d1=nb ascIIs (length of hex number)
  9002.  
  9003. print_hexCR    move.l    a0,-(a7)
  9004.         lea.l    general_txt,a0
  9005.         bsr.b    conv_hex
  9006.         move.b    #$a,(a0,d1.w)        ;set CR CHAR
  9007.         sf    1(a0,d1.w)        ;set end CHAR
  9008.         bsr    print
  9009.         move.l    (a7)+,a0
  9010.         rts
  9011.  
  9012. ;-------------- Print a decimal number --------------------
  9013.  
  9014. ;-> d0=dec number
  9015. ;-> d1=nb ascIIs    ;bit7=show zero
  9016.  
  9017. print_dec    movem.l    d0/a0,-(a7)
  9018.         lea.l    general_txt,a0
  9019.         bsr.b    conv_dec
  9020.         lea.l    general_txt,a0
  9021.         and.w    #$7f,d1
  9022.         sf    1(a0,d1.w)        ;set end CHAR
  9023.         bsr    print
  9024.         movem.l    (a7)+,d1/a0
  9025.         rts
  9026.  
  9027. ;-------------- Print a decimal number followed by a CR ---
  9028.  
  9029. ;-> d0=dec number
  9030. ;-> d1=nb ascIIs    ;bit7=show zero
  9031.  
  9032. print_decCR    movem.l    d0/a0,-(a7)
  9033.         lea.l    general_txt,a0
  9034.         bsr.b    conv_dec
  9035.         lea.l    general_txt,a0
  9036.         and.w    #$7f,d1
  9037.         move.b    #$a,1(a0,d1.w)        ;set CR CHAR
  9038.         sf    2(a0,d1.w)        ;set end CHAR
  9039.         bsr    print
  9040.         movem.l    (a7)+,d1/a0
  9041.         rts
  9042.  
  9043. ;-------------- Convert hex to ascII ------------------
  9044. ;-> d0=hex number
  9045. ;-> d1=nb ascIIs (length of hex number)
  9046. ;-> a0=ptr on ascII destination buffer
  9047.  
  9048. conv_hex    movem.l    d0-d2/a1,-(a7)
  9049.         and.w    #$007f,d1        ;clear bit 7
  9050.         lea.l    hex_list,a1
  9051.         subq.w    #1,d1
  9052. .do_conv_hex    move.w    d0,d2
  9053.         and.w    #$f,d2
  9054.         move.b    (a1,d2.w),(a0,d1.w)
  9055.         lsr.l    #4,d0
  9056.         dbf    d1,.do_conv_hex
  9057.         movem.l    (a7)+,d0-d2/a1
  9058.         rts
  9059.  
  9060. ;-------------- Convert dec to ascII ------------------
  9061. ;d0=dec number
  9062. ;d1=nb ascIIs        bit7=show zero
  9063. ;a0=ptr on ascII buffer
  9064.  
  9065. conv_dec:    movem.l    d0-d4/a1,-(a7)
  9066.  
  9067.         btst    #7,d1
  9068.         sne    d3
  9069.         and.w    #$003f,d1
  9070.  
  9071.         lea.l    dec_list,a1
  9072.         neg.w    d1
  9073.         add.w    #10,d1
  9074.         lsl.w    #2,d1
  9075.         add.w    d1,a1
  9076.  
  9077.         move.b    #' ',d4
  9078.         tst.l    d0
  9079.         bpl.b    .no_minus
  9080.         neg.l    d0
  9081.         move.b    #'-',d4
  9082.  
  9083. .no_minus    move.b    #' ',(a0)+
  9084.         move.l    d0,d2
  9085. .next        moveq    #0,d0
  9086.         move.l    (a1)+,d1
  9087.         beq.b    .end_dec
  9088. .loop        cmp.l    d2,d1
  9089.         bgt.b    .ok_dix
  9090.         sub.l    d1,d2
  9091.         addq.l    #1,d0
  9092.         bra.b    .loop
  9093. .ok_dix        subq.l    #1,d1
  9094.         bne.b    .no_last
  9095.         tst.b    d3
  9096.         bne.b    .no_last
  9097.         st    d3
  9098.         move.b    d4,-1(a0)
  9099. .no_last    tst.b    d3
  9100.         bne.b    .no_first
  9101.         st    d3
  9102.         tst.b    d0
  9103.         beq.b    .empty
  9104.         move.b    d4,-1(a0)
  9105.         bra.b    .no_first
  9106. .empty        sf    d3
  9107.         move.b    #' ',d0
  9108.         bra.b    .ok_spc
  9109. .no_first    cmp.b    #9,d0
  9110.         bls.b    .ok_dec
  9111.         moveq    #0,d0
  9112. .ok_dec        add.b    #'0',d0
  9113. .ok_spc        move.b    d0,(a0)+
  9114.         bra.b    .next
  9115.  
  9116. .end_dec    movem.l    (a7)+,d0-d4/a1
  9117.         rts
  9118.  
  9119.         cnop 0,4
  9120. dec_list    dc.l 1000000000
  9121.         dc.l 100000000
  9122.         dc.l 10000000
  9123.         dc.l 1000000
  9124.         dc.l 100000
  9125.         dc.l 10000
  9126.         dc.l 1000
  9127.         dc.l 100
  9128.         dc.l 10
  9129.         dc.l 1
  9130.         dc.l 0
  9131.  
  9132. **********************************************************
  9133.  
  9134. init_ascII    movem.l    d0-d2/a1-a3,-(a7)
  9135.         lea.l    ascII_conv,a1
  9136.  
  9137.         move.w    #256-1,d0
  9138.         moveq    #0,d1
  9139.  
  9140. loop_ia        lea.l    ascII,a2
  9141.         move.w    #end_ascII-ascII-1,d2
  9142. seek_ascII_i    cmp.b    (a2)+,d1
  9143.         dbeq    d2,seek_ascII_i
  9144.  
  9145.         lea.l    ascII+1,a3
  9146.         sub.l    a3,a2
  9147.         move.w    a2,d2
  9148.         move.b    d2,(a1)+
  9149.         addq.w    #1,d1
  9150.         dbf    d0,loop_ia
  9151.  
  9152.         movem.l    (a7)+,d0-d2/a1-a3
  9153.         rts
  9154.  
  9155. **************************************************************************
  9156.  
  9157. ;save DMA disk buffer to backup_dma
  9158. ;-> a0=buffer chip address
  9159.  
  9160. save_buffer    movem.l    d0-d1/a0-a1,-(a7)
  9161.         move.l    a0,buffer
  9162.         lea.l    backup_dma,a1
  9163.         move.w    #($1a00*2)/4-1,d1
  9164. .exg        move.l    (a0)+,(a1)+
  9165.         dbf    d1,.exg
  9166.         movem.l    (a7)+,d0-d1/a0-a1
  9167.         rts
  9168.  
  9169. rest_buffer    movem.l    d0-d1/a0-a1,-(a7)
  9170.         move.l    buffer,a1
  9171.         lea.l    backup_dma,a0
  9172.         move.w    #($1a00*2)/4-1,d1
  9173. .exg        move.l    (a0)+,(a1)+
  9174.         dbf    d1,.exg
  9175.         movem.l    (a7)+,d0-d1/a0-a1
  9176.         rts
  9177.  
  9178. ***********************************************************
  9179.  
  9180. ;-------------- read a single sector from floppy disk -----
  9181.  
  9182. ;-> d0=no of sector to read
  9183. ;-> a0=address to copy sector into
  9184.  
  9185. read_fsector    movem.l    d0-d7/a0-a4,-(a7)
  9186.  
  9187.         move.l    a0,a3
  9188.  
  9189.         moveq    #0,d2
  9190.         move.w    d0,d2
  9191.         divu    #11,d2            ;d2=track_no of sector to read
  9192.         cmp.w    track_buffer_no,d2    ;is track_buffer ok ?
  9193.         bne.b    .notsame
  9194.  
  9195. .okaccess    lea.l    track_sector,a0
  9196.         move.l    d2,d0
  9197.         swap    d0
  9198.         tst.b    (a0,d0.w)        ;sector is in buffer ?
  9199.         bne.b    .notsame
  9200.  
  9201.         mulu    #512,d0            ;offset in track_buffer
  9202.         lea.l    track_buffer,a0
  9203.  
  9204.         add.l    d0,a0
  9205.         moveq    #512/8-1,d0
  9206. .copysector    move.l    (a0)+,(a3)+
  9207.         move.l    (a0)+,(a3)+
  9208.         dbf    d0,.copysector
  9209.         bra.b    .okread
  9210.  
  9211. .notsame    bsr    write_flush
  9212.         move.w    d2,track_buffer_no
  9213.         move.w    d2,d0
  9214.         mulu    #11,d0
  9215.         lea.l    track_sector,a0
  9216.         clr.l    (a0)+            ;all sectors
  9217.         clr.l    (a0)+            ;are
  9218.         clr.l    (a0)+            ;loaded
  9219.         lea.l    track_buffer,a0
  9220.         moveq    #11,d1            ;read 11 sectors (one track)
  9221.         moveq    #0,d7            ;read command
  9222.         bsr    access            ;read the track in track_buffer
  9223.         beq.b    .okaccess        ;no error ?
  9224.  
  9225.         moveq    #-1,d0
  9226.         move.w    d0,track_buffer_no    ;an error occured
  9227.         lea.l    track_sector,a0
  9228.         move.l    d0,(a0)+        ;all sectors
  9229.         move.l    d0,(a0)+        ;are
  9230.         move.l    d0,(a0)+        ;NOT loaded
  9231.  
  9232. .okread        tst.w    drive_err
  9233.         movem.l    (a7)+,d0-d7/a0-a4
  9234.         rts
  9235.  
  9236. ;-------------- write a single sector to floppy disk ------
  9237.  
  9238. ;-> d0=no of sector to write
  9239. ;-> a0=address to copy sector from
  9240.  
  9241. write_fsector    movem.l    d0-d7/a0-a4,-(a7)
  9242.  
  9243.         move.l    a0,a3
  9244.  
  9245.         moveq    #0,d2
  9246.         move.w    d0,d2
  9247.         divu    #11,d2            ;d2=track_no of sector to write
  9248.         cmp.w    track_buffer_no,d2    ;is track_buffer ok ?
  9249.         beq.b    .oksame
  9250.  
  9251. .notsame    bsr.b    write_flush
  9252.         move.w    d2,track_buffer_no
  9253.         moveq    #-1,d0
  9254.         lea.l    track_sector,a0
  9255.         move.l    d0,(a0)+        ;all sectors
  9256.         move.l    d0,(a0)+        ;are
  9257.         move.l    d0,(a0)+        ;NOT loaded
  9258.  
  9259. .oksame        move.l    d2,d0
  9260.         swap    d0
  9261.         lea.l    track_sector,a0
  9262.         sf    (a0,d0.w)        ;set sector as loaded in buffer
  9263.         mulu    #512,d0
  9264.         lea.l    track_buffer,a0
  9265.         add.l    d0,a0
  9266.         moveq    #512/8-1,d0
  9267. .copysector    move.l    (a3)+,(a0)+
  9268.         move.l    (a3)+,(a0)+
  9269.         dbf    d0,.copysector
  9270.  
  9271.         st    flush_needed
  9272.  
  9273.         tst.w    drive_err
  9274.         movem.l    (a7)+,d0-d7/a0-a4
  9275.         rts
  9276.  
  9277. ;-------------- flush write buffer for floppy disk --------
  9278.  
  9279. write_flush    movem.l    d0-d7/a0-a4,-(a7)
  9280.  
  9281.         tst.w    track_buffer_no
  9282.         bmi.w    .noflush
  9283.  
  9284.         tst.b    flush_needed
  9285.         beq.w    .noflush
  9286.  
  9287. .recheck    lea.l    track_sector,a0
  9288.         lea.l    11(a0),a1        ;end of sectors list
  9289.         moveq    #-1,d2
  9290.         moveq    #11-1,d0
  9291. .seek        addq.l    #1,d2
  9292.         tst.b    (a0)+
  9293.         dbne    d0,.seek
  9294.         beq.b    .goflush
  9295.  
  9296.         moveq    #0,d1            ;d1=nb sectors to read
  9297.         subq.l    #1,a0
  9298. .link        sf    (a0)+            ;set sector as loaded
  9299.         addq.l    #1,d1
  9300.         cmp.l    a1,a0
  9301.         beq.b    .okread
  9302.         tst.b    (a0)
  9303.         bne.b    .link
  9304.  
  9305. .okread        cmp.w    #11,d1
  9306.         beq.b    .noflush
  9307.         lea.l    track_buffer,a0
  9308.         move.w    track_buffer_no,d0
  9309.         mulu    #11,d0
  9310.         add.w    d2,d0
  9311.         mulu    #512,d2
  9312.         add.l    d2,a0
  9313.         moveq    #0,d7            ;read command
  9314.         bsr    access
  9315.         bne.b    .error
  9316.         bra.b    .recheck
  9317.  
  9318. .goflush    move.w    track_buffer_no,d0
  9319.         mulu    #11,d0
  9320.         lea.l    track_buffer,a0
  9321.         moveq    #11,d1            ;write 11 sectors (one track)
  9322.         moveq    #-1,d7            ;write command
  9323.         bsr    access
  9324.         beq.b    .noerr
  9325.  
  9326. .error        moveq    #-1,d0
  9327.         move.w    d0,track_buffer_no    ;an error occured
  9328.         lea.l    track_sector,a0
  9329.         move.l    d0,(a0)+        ;all sectors
  9330.         move.l    d0,(a0)+        ;are
  9331.         move.l    d0,(a0)+        ;NOT loaded
  9332.  
  9333. .noerr
  9334. .noflush    sf    flush_needed
  9335.  
  9336.         tst.w    drive_err
  9337.         movem.l    (a7)+,d0-d7/a0-a4
  9338.         rts
  9339.  
  9340. ;-------------- write multiple sectors to floppy ----------
  9341. ;-------------- exg pic memory and stop interrupts --------
  9342. ;-> d0=first sector
  9343. ;-> d1=nb of sector
  9344. ;-> a0=address
  9345.  
  9346. write        movem.l    d0-d1/a0,-(a7)
  9347.         tst.w    d1
  9348.         beq.b    .nosave
  9349.         bsr    remove_pic
  9350. .loop        bsr    write_fsector
  9351.         addq.w    #1,d0
  9352.         lea.l    512(a0),a0
  9353.         subq.w    #1,d1
  9354.         bne.b    .loop
  9355.         bsr    write_flush
  9356.         bsr    set_pic
  9357. .nosave        tst.w    drive_err
  9358.         movem.l    (a7)+,d0-d1/a0
  9359.         rts
  9360.  
  9361. ;-------------- read multiple sectors from floppy ---------
  9362. ;-------------- exg pic memory and restore interrupts -----
  9363.  
  9364. ;-> d0=first sector
  9365. ;-> d1=nb of sector
  9366. ;-> a0=address
  9367.  
  9368. read        movem.l    d0-d1/a0,-(a7)
  9369.         tst.w    d1
  9370.         beq.b    .noread
  9371.         bsr    remove_pic
  9372. .loop        bsr    read_fsector
  9373.         addq.w    #1,d0
  9374.         lea.l    512(a0),a0
  9375.         subq.w    #1,d1
  9376.         bne.b    .loop
  9377.         bsr    set_pic
  9378. .noread        tst.w    drive_err
  9379.         movem.l    (a7)+,d0-d1/a0
  9380.         rts
  9381.  
  9382. ;-------------- write multiple sectors to floppy ----------
  9383.  
  9384. ;-> d0=first sector
  9385. ;-> d1=nb of sector
  9386. ;-> a0=address
  9387.  
  9388. write2        movem.l    d0-d1/a0,-(a7)
  9389.         tst.w    d1
  9390.         beq.b    .nosave
  9391. .loop        bsr    write_fsector
  9392.         addq.w    #1,d0
  9393.         lea.l    512(a0),a0
  9394.         subq.w    #1,d1
  9395.         bne.b    .loop
  9396.         bsr    write_flush
  9397. .nosave        tst.w    drive_err
  9398.         movem.l    (a7)+,d0-d1/a0
  9399.         rts
  9400.  
  9401. ;-------------- read multiple sectors from floppy ---------
  9402.  
  9403. ;-> d0=first sector
  9404. ;-> d1=nb of sector
  9405. ;-> a0=address
  9406.  
  9407. read2        movem.l    d0-d1/a0,-(a7)
  9408.         tst.w    d1
  9409.         beq.b    .noread
  9410. .loop        bsr    read_fsector
  9411.         addq.w    #1,d0
  9412.         lea.l    512(a0),a0
  9413.         subq.w    #1,d1
  9414.         bne.b    .loop
  9415. .noread        tst.w    drive_err
  9416.         movem.l    (a7)+,d0-d1/a0
  9417.         rts
  9418.  
  9419. ***********************************************
  9420. ;d0.w=start sector (if write then d0 MUST be a multiple of 11)
  9421. ;d1.w=nb sectors   (if write then d1 MUST be a multiple of 11)
  9422. ;d7: -1=write 0=read
  9423. ;a0=address to load/save
  9424.  
  9425. ;if d1=-1 & d7=-1 -> format whole disk
  9426.  
  9427. access:        movem.l    d0-a6,-(a7)
  9428.         lea.l    $dff000,a6
  9429.         st    floppy_op
  9430.  
  9431.         ext.l    d0
  9432.         ext.l    d1
  9433.  
  9434.         move.l    a0,a4            ;a4=address of actual sector
  9435.  
  9436.         lea.l    $40000,a0
  9437.         bsr    save_buffer
  9438.  
  9439.         sf    first_sauve
  9440.         tst.w    d1
  9441.         smi    format
  9442.         bpl.b    .no_format
  9443.         moveq    #0,d0
  9444.         move.w    #22*80,d1
  9445.         lea.l    track_sector,a0
  9446.         moveq    #-1,d5
  9447.         move.l    d5,(a0)+        ;all sectors
  9448.         move.l    d5,(a0)+        ;are NOT
  9449.         move.l    d5,(a0)+        ;loaded in track_buffer
  9450.         move.w    d5,track_buffer_no
  9451. .no_format
  9452.  
  9453.         move.w    d1,sectpos        ;nb sectors to read/write
  9454.  
  9455.         cmp.l    #-1,d7            ;write requested ?
  9456.         seq    writes
  9457.  
  9458.         ext.l    d0
  9459.         move.l    d0,d5
  9460.         divu    #11,d5            ;d5.w = start_track
  9461.         move.l    d5,d0
  9462.         swap    d0
  9463.         move.w    d0,startsec    ;nb sectors to skip in 1st track
  9464.  
  9465.         lea.l    $bfd100,a0
  9466.         move.w    #$8210,$96(a6)
  9467.  
  9468.         move.w    $10(a6),d0
  9469.         or.w    #$8000,d0
  9470.         move.w    d0,OldAdk
  9471.         move.w    #$7fff,$9e(a6)
  9472.         move.w    #$9100,$9e(a6)
  9473.         tst.b    writes
  9474.         bne.b    no_sync
  9475.         move.w    #$8400,$9e(a6)
  9476. no_sync:    move.w    #$4489,$7e(a6)
  9477.  
  9478.         bsr    motor_on        ;turn drive motor ON
  9479.         tst.w    drive_err
  9480.         bne.w    fin
  9481.         tst.b    writes
  9482.         beq.b    .read
  9483.         btst    #3,$bfe001        ;test if write protected
  9484.         bne.b    .read
  9485.         move.w    #WRITEPROTECT_ERR,drive_err
  9486.         bra.w    fin
  9487. .read
  9488.         bsr    inittete    ;init head pos (track 0) if needed
  9489.  
  9490.         move.w    drive,d0
  9491.         bclr    d0,(a0)
  9492.  
  9493.         move.w    d5,d0
  9494.         bsr    settete            ;move heads to 1st track
  9495.  
  9496.         sf    ctrl            ;clear end signal
  9497.  
  9498. next:        movem.l    d0-d1/a0/a3,-(a7)    ;check if there is a conflict
  9499.         move.l    buffer,d0        ;between the DMA buffer and
  9500.         move.l    d0,d1            ;the actual sector accessed
  9501.         add.l    #$1a00*2,d1
  9502.         lea.l    11*512(a4),a3
  9503.         cmp.l    d0,a3
  9504.         ble.b    .okbuf
  9505.         cmp.l    d1,a4
  9506.         bge.b    .okbuf
  9507.         bsr    rest_buffer
  9508.         move.l    #$50000,d1
  9509.         cmp.l    #$40000,d0
  9510.         beq.b    .go40
  9511.         move.l    #$40000,d1
  9512. .go40        move.l    d1,a0
  9513.         bsr    save_buffer
  9514. .okbuf        movem.l    (a7)+,d0-d1/a0/a3
  9515.  
  9516.         tst.b    writes
  9517.         beq.b    ok_read
  9518.         tst.w    startsec        ;if write then 1st sector
  9519.         bne.b    fin            ;must be a multiple of 11
  9520.         cmp.w    #11,sectpos        ;write at least 11 sectors
  9521.         blt.b    fin
  9522.         bsr    sauve
  9523.         bra.b    ok_sauve
  9524. ok_read:    bsr    charge
  9525.         tst.w    drive_err
  9526.         bne.b    fin
  9527. ok_sauve:    tst.b    ctrl            ;end of access ?
  9528.         bne.b    fin
  9529.         tst.b    break
  9530.         bne.b    fin
  9531.  
  9532.     ;    btst    #5,$bfe001        ;removed due to AT 1200 bug !
  9533.     ;    beq.b    .okspeed
  9534.     ;    move.w    #NODISK_ERR,drive_err
  9535.     ;    bra.b    fin
  9536.  
  9537. .okspeed    movem.l    d0/a1,-(a7)
  9538.         lea.l    track,a1
  9539.         move.w    drive,d0
  9540.         add.w    d0,d0
  9541.         move.w    -3*2(a1,d0.w),d0    ;get previous track pos
  9542.         addq.w    #1,d0            ;step to next track or side
  9543.         bsr    settete
  9544.         movem.l    (a7)+,d0/a1
  9545.         bra.w    next
  9546.  
  9547. fin:        bsr    timer2
  9548.         bsr    rest_buffer
  9549.  
  9550.         move.w    drive,d0
  9551.         bset    d0,(a0)            ;deselect drive
  9552.         bsr    timer1
  9553.  
  9554.         move.w    #$7fff,$9e(a6)
  9555.         move.w    OldAdk,$9e(a6)
  9556.  
  9557.         tst.w    drive_err
  9558.         movem.l    (a7)+,d0-a6
  9559.         rts
  9560.  
  9561. *******************************
  9562.  
  9563. motor_on:    movem.l    d0/a0,-(a7)
  9564.         lea.l    $bfd100,a0
  9565.         move.w    drive,d0
  9566.         or.b    #$80,(a0)
  9567.         bset    d0,(a0)
  9568.         bsr    timer1
  9569.         and.b    #$7f,(a0)
  9570.         bsr    timer1
  9571.         bclr    d0,(a0)
  9572.         bsr    timer1
  9573.  
  9574.         btst    d0,mot_on
  9575.         bne.b    .already_on
  9576.  
  9577.         move.b    #0,$bfe801
  9578.  
  9579. .motor_wait    cmp.b    #30,$bfe801        ;wait > 500 ms
  9580.         bls.b    .motor_wait
  9581.  
  9582.         bset    d0,mot_on
  9583.  
  9584. .already_on    movem.l    (a7)+,d0/a0
  9585.         rts
  9586.  
  9587. ;Old code removed due to AT 1200 bug !
  9588.  
  9589. ;motor_wait:    cmp.b    #80,$bfe801
  9590. ;        bhi.b    .no_mot_on
  9591. ;        btst    #5,$bfe001
  9592. ;        bne.b    motor_wait
  9593. ;.out        movem.l    (a7)+,d0/a0
  9594. ;        rts
  9595.  
  9596. ;.no_mot_on    move.w    #NODISK_ERR,drive_err
  9597. ;        bra.b    .out
  9598.  
  9599. *******************************
  9600.  
  9601. motor_off:    bsr.w    rest_head
  9602.         movem.l    d0/a0,-(a7)
  9603.         lea.l    $bfd100,a0
  9604.         move.w    drive,d0
  9605.         bset    d0,(a0)
  9606.         bsr    timer1
  9607.         or.b    #$80,(a0)
  9608.         bsr    timer1
  9609.         bclr    d0,(a0)
  9610.         bsr    timer1
  9611.         bset    d0,(a0)
  9612.         bsr    timer1
  9613.         bclr    d0,mot_on
  9614.         movem.l    (a7)+,d0/a0
  9615.         rts
  9616.  
  9617. *******************************
  9618.  
  9619. ;>0.6 ms
  9620.  
  9621. timer1        movem.l    d0-d1/a6,-(a7)
  9622.         lea.l    $dff000,a6
  9623.         moveq    #10-1,d0
  9624.         cmp.b    #2,config_screen
  9625.         bne.b    .loop
  9626.         moveq    #10*2-1,d0
  9627. .loop        move.b    $6(a6),d1
  9628. .w1        cmp.b    $6(a6),d1
  9629.         beq.b    .w1
  9630.         dbf    d0,.loop
  9631.         movem.l    (a7)+,d0-d1/a6
  9632.         rts
  9633.  
  9634.  
  9635. ;>3 ms
  9636.  
  9637. timer2        movem.l    d0-d1/a6,-(a7)
  9638.         lea.l    $dff000,a6
  9639.         moveq    #50-1,d0
  9640.         cmp.b    #2,config_screen
  9641.         bne.b    .loop
  9642.         moveq    #50*2-1,d0
  9643. .loop        move.b    $6(a6),d1
  9644. .w1        cmp.b    $6(a6),d1
  9645.         beq.b    .w1
  9646.         dbf    d0,.loop
  9647.         movem.l    (a7)+,d0-d1/a6
  9648.         rts
  9649.  
  9650. ;>18 ms
  9651.  
  9652. timer3        movem.l    d0-d1/a6,-(a7)
  9653.         lea.l    $dff000,a6
  9654.         move.w    #284-1,d0
  9655.         cmp.b    #2,config_screen
  9656.         bne.b    .loop
  9657.         move.w    #284*2-1,d0
  9658. .loop        move.b    $6(a6),d1
  9659. .w1        cmp.b    $6(a6),d1
  9660.         beq.b    .w1
  9661.         dbf    d0,.loop
  9662.         movem.l    (a7)+,d0-d1/a6
  9663.         rts
  9664.  
  9665. *******************************
  9666.  
  9667. step_head:    bclr    #0,(a0)
  9668.         bsr    timer1
  9669.         bset    #0,(a0)
  9670.         bsr    timer2
  9671.         rts
  9672.  
  9673. *******************************
  9674.  
  9675. ;-------------- check which drive is present ----
  9676.  
  9677. test_drive    movem.l    d0-d3/a0-a2,-(a7)
  9678.         lea.l    $bfd100,a0
  9679.         lea.l    $bfe001,a1
  9680.         move.b    #$ff,(a0)
  9681.         lea.l    drive_present,a2
  9682.         st    (a2)+            ;DF0: always present
  9683.  
  9684.         moveq    #4,d0            ;drive1 SEL
  9685.  
  9686.         moveq    #3-1,d3            ;3 drives to test
  9687.  
  9688. .next_drive    and.b    #$7f,(a0)
  9689.         bsr    timer1
  9690.         bclr    d0,(a0)            ;switch drive ON
  9691.         bsr    timer1
  9692.         bset    d0,(a0)
  9693.         bsr    timer1
  9694.         or.b    #$80,(a0)
  9695.         bclr    d0,(a0)            ;switch drive OFF
  9696.         bsr    timer1
  9697.  
  9698.         moveq    #0,d1            ;d1=drive ID
  9699.         moveq    #32-1,d2
  9700. .loop        add.l    d1,d1
  9701.         btst    #5,(a1)            ;one bit of ID in RDY
  9702.         beq.b    .zero
  9703.         addq.l    #1,d1            ;read drive ID
  9704. .zero        bset    d0,(a0)            ;pulse SEL
  9705.         bsr    timer1
  9706.         bclr    d0,(a0)
  9707.         bsr    timer1
  9708.         dbf    d2,.loop
  9709.  
  9710.         bset    d0,(a0)            ;deselect drive
  9711.         bsr    timer1
  9712.  
  9713.         tst.l    d1
  9714.         seq    (a2)+
  9715.         addq.w    #1,d0            ;next drive
  9716.         dbf    d3,.next_drive
  9717.  
  9718.         movem.l    (a7)+,d0-d3/a0-a2
  9719.         rts
  9720.  
  9721. ******************************
  9722.  
  9723. ;-------------- init head pos -------------------
  9724.  
  9725. inittete:    movem.l    d0-d1/a0-a1,-(a7)
  9726.         lea.l    $bfd100,a0
  9727.         move.w    drive,d0
  9728.         move.w    d0,d1
  9729.         add.w    d1,d1
  9730.         btst    d0,init        ;test if the selected drive was inited
  9731.         bne.b    .no_init
  9732.         bclr    d0,(a0)
  9733.         lea.l    old_head,a1
  9734.         clr.w    -3*2(a1,d1.w)    ;save old position of head here
  9735.         bset    #1,(a0)
  9736.         bsr    timer1
  9737.  
  9738. .cont00        btst    #4,$bfe001
  9739.         beq.b    .track00
  9740.         bsr.w    step_head
  9741.         addq.w    #2,-3*2(a1,d1.w)
  9742.         bra.b    .cont00
  9743.  
  9744. .track00    lea.l    track,a1
  9745.         clr.w    -3*2(a1,d1.w)    ;current head pos = 0
  9746.         bset    d0,init
  9747.         bset    d0,(a0)
  9748.  
  9749. .no_init    movem.l    (a7)+,d0-d1/a0-a1
  9750.         rts
  9751.  
  9752. rest_head    movem.l    d0-d1/a1,-(a7)
  9753.         move.w    drive,d0
  9754.         btst    d0,init
  9755.         beq.b    .no_rest
  9756.         lea.l    $bfd100,a0
  9757.         bclr    d0,(a0)
  9758.         bsr    timer1
  9759.         bclr    d0,init
  9760.         lea.l    old_head,a1
  9761.         add.w    d0,d0
  9762.         move.w    -3*2(a1,d0.w),d0
  9763.         bsr    timer1
  9764.         bsr    settete
  9765.         move.w    drive,d0
  9766.         lea.l    track,a1
  9767.         add.w    d0,d0
  9768.         move.w    #-1,-3*2(a1,d0.w)
  9769.         bset    d0,(a0)
  9770. .no_rest    movem.l    (a7)+,d0-d1/a1
  9771.         rts
  9772.  
  9773. *******************************
  9774.  
  9775. ;d0=track to reach (0-159)
  9776.  
  9777. settete:    movem.l    d0-d4,-(a7)
  9778.         sf    d4
  9779.         bsr    timer1
  9780.         move.l    a1,-(a7)
  9781.         lea.l    track,a1
  9782.         move.w    drive,d1
  9783.         add.w    d1,d1
  9784.         move.w    -3*2(a1,d1.w),d1    ;get old pos of heads
  9785.         move.l    (a7)+,a1
  9786.         move.w    d0,d3            ;new pos
  9787.         asr.w    #1,d0
  9788.         asr.w    #1,d1
  9789.         cmp.w    d0,d1
  9790.  
  9791.         blt.b    moinstete
  9792.         bset    #1,(a0)            ;set dir
  9793.         sub.w    d0,d1
  9794.         move.w    d1,d0
  9795.         moveq    #-2,d2
  9796.         bra.b    go_dbf
  9797.  
  9798. moinstete:    bclr    #1,(a0)            ;set dir
  9799.         sub.w    d1,d0
  9800.         moveq    #2,d2
  9801.         bra.b    go_dbf
  9802.  
  9803. loop_set:    bsr.w    step_head
  9804.         st    d4
  9805.  
  9806. go_dbf:        dbf    d0,loop_set
  9807.  
  9808.         move.l    a1,-(a7)
  9809.         move.w    drive,d0
  9810.         lea.l    track,a1
  9811.         add.w    d0,d0
  9812.         move.w    d3,-3*2(a1,d0.w)    ;set new pos of heads
  9813.         move.l    (a7)+,a1
  9814.         and.w    #1,d3
  9815.         bne.b    impair
  9816.         bset    #2,(a0)
  9817.         bra.b    pair
  9818. impair:        bclr    #2,(a0)
  9819. pair:        bsr    timer2
  9820.  
  9821.         tst.b    d4
  9822.         beq.b    .nomove
  9823.         bsr    timer3
  9824. .nomove
  9825.         movem.l    (a7)+,d0-d4
  9826.         rts
  9827.  
  9828. ***************************************
  9829.  
  9830. charge:        movem.l    d0/d7/a3,-(a7)
  9831.         moveq    #5-1,d7
  9832. .loop        move.w    #$4000,$24(a6)
  9833.         bsr    timer1
  9834.         move.l    buffer,a3
  9835.         move.l    a3,$20(a6)
  9836.         move.w    #$9a00,d0        ;len=$1a00*2=$3400
  9837.         move.w    #2,$9c(a6)
  9838.         move.w    d0,$24(a6)
  9839.         move.w    d0,$24(a6)
  9840.  
  9841.         move.b    #0,$bfe801
  9842.  
  9843. .waitdmad    cmp.b    #100,$bfe801        ;wait no more than 2s
  9844.         bhi.b    .error
  9845.         move.w    $1e(a6),d0
  9846.         and.w    #2,d0
  9847.         beq.b    .waitdmad
  9848.  
  9849.         move.w    #$4000,$24(a6)
  9850.  
  9851.         bsr.b    dmfm
  9852.         beq.b    .out
  9853.         dbf    d7,.loop        ;retry
  9854.  
  9855. .error        move.w    #TRACKCORRUPT_ERR,drive_err    ;track corrupted
  9856. .out        movem.l    (a7)+,d0/d7/a3
  9857.         rts
  9858.  
  9859. ***************************************
  9860.  
  9861. dmfm:        movem.l    d0-d7/a0-a2,-(a7)
  9862.         move.l    #$55555555,d7
  9863.  
  9864.         move.l    a4,a0                ;save old status
  9865.         move.w    sectpos,oldsectpos
  9866.         move.w    startsec,oldstartsec
  9867.  
  9868.         moveq    #11-1,d4
  9869.         moveq    #0,d3
  9870.         move.l    a3,a1
  9871.         lea.l    $1a00*2(a1),a1
  9872.  
  9873. nextsector:    move.l    a3,a2
  9874.  
  9875. seek:        cmp.l    a1,a2
  9876.         bge.w    mfm_error
  9877.         cmp.w    #$4489,(a2)+
  9878.         bne.b    seek
  9879.         cmp.w    #$4489,(a2)
  9880.         beq.b    seek
  9881.         move.b    2(a2),D0
  9882.         move.b    6(a2),D1
  9883.         and.b    d7,d0
  9884.         and.b    d7,d1
  9885.         add.b    d0,d0
  9886.         or.b    d1,d0
  9887.         cmp.b    d0,d3
  9888.         beq.b    oksec
  9889.         lea.l    $43e(a2),a2
  9890.         bra.b    seek
  9891. oksec:        addq.l    #1,d3
  9892.  
  9893.         lea.l    $0028(a2),a2
  9894.  
  9895.         move.l    (a2)+,d0
  9896.         move.l    (a2)+,d1
  9897.         and.l    d7,d0
  9898.         and.l    d7,d1
  9899.         add.l    d0,d0
  9900.         or.l    d1,d0
  9901.         move.l    d0,d6
  9902.  
  9903.         move.l    a2,-(a7)
  9904.         lea.l    -$30(a2),a2
  9905.  
  9906.         moveq    #0,d0
  9907.         moveq    #$0a-1,d5
  9908. .nextcheck:    move.l    (a2)+,d1
  9909.         eor.l    d1,d0
  9910.         dbf    d5,.nextcheck
  9911.  
  9912.         move.l    (a7)+,a2
  9913.  
  9914.         and.l    d7,d0
  9915.         cmp.l    d6,d0        ;test header checksum
  9916.         bne.w    mfm_error
  9917.  
  9918.         move.l    (a2)+,d0
  9919.         move.l    (a2)+,d1
  9920.         and.l    d7,d0
  9921.         and.l    d7,d1
  9922.         add.l    d0,d0
  9923.         or.l    d1,d0
  9924.         move.l    d0,d6
  9925.  
  9926.         move.l    a2,-(a7)
  9927.  
  9928.         moveq    #0,d0
  9929.         move.w    #$100/4-1,d5
  9930. .nextcheck2:    move.l    (a2)+,d1
  9931.         eor.l    d1,d0
  9932.         move.l    (a2)+,d1
  9933.         eor.l    d1,d0
  9934.         move.l    (a2)+,d1
  9935.         eor.l    d1,d0
  9936.         move.l    (a2)+,d1
  9937.         eor.l    d1,d0
  9938.         dbf    d5,.nextcheck2
  9939.  
  9940.         move.l    (a7)+,a2
  9941.  
  9942.         and.l    d7,d0
  9943.         cmp.l    d6,d0        ;test data checksum
  9944.         bne.b    mfm_error
  9945.  
  9946.         tst.w    sectpos        ;all sectors loaded ?
  9947.         beq.b    pasokload
  9948.         tst.w    startsec;have we reached the 1st sector to load ?
  9949.         beq.b    okloadsec
  9950.         subq.w    #1,startsec
  9951.         bra.b    pasokload
  9952.  
  9953. okloadsec:    moveq    #$80-1,d5
  9954. decodemfm:    move.l    $200(a2),d1
  9955.         move.l    (a2)+,d0
  9956.         and.l    d7,d0
  9957.         and.l    d7,d1
  9958.         add.l    d0,d0
  9959.         or.l    d1,d0
  9960.         move.l    d0,(a4)+
  9961.         dbf    d5,decodemfm
  9962.  
  9963.         subq.w    #1,sectpos    ;nb sectors to load --
  9964.         bne.b    pasokload
  9965.         st    ctrl        ;set end signal
  9966.         bra.b    reload
  9967.  
  9968. pasokload:    dbf    d4,nextsector
  9969.  
  9970. reload:        movem.l    (a7)+,d0-d7/a0-a2
  9971.         moveq    #0,d0            ;ok
  9972.         rts
  9973.  
  9974. mfm_error:    move.w    oldsectpos,sectpos    ;restore status
  9975.         move.w    oldstartsec,startsec
  9976.         move.l    a0,a4
  9977.         movem.l    (a7)+,d0-d7/a0-a2
  9978.         moveq    #-1,d0            ;an error occured
  9979.         rts
  9980.  
  9981. ***************************************************
  9982.  
  9983. sauve:
  9984.         bsr.b    code_mfm
  9985.  
  9986.         move.w    #$4000,$24(a6)
  9987.         bsr    timer2
  9988.         move.l    buffer,a3
  9989.         move.l    a3,$20(a6)
  9990.         move.w    #$c000+$220*11+$2a0,d0
  9991.         move.w    #2,$9c(a6)
  9992.         move.w    d0,$24(a6)
  9993.         move.w    d0,$24(a6)
  9994.  
  9995. waitdmad2:    move.w    $1e(a6),d0
  9996.         and.w    #2,d0
  9997.         beq.b    waitdmad2
  9998.  
  9999.         move.w    #$4000,$24(a6)
  10000.  
  10001.         bsr    timer2
  10002.  
  10003.         rts
  10004.  
  10005. ***********************************
  10006. ;Code track
  10007. ;-> a4=data to be coded
  10008.  
  10009. code_mfm:    movem.l    a0-a3/d0-d7,-(a7)
  10010.  
  10011.         lea.l    track,a3
  10012.         move.w    drive,d0
  10013.         add.w    d0,d0
  10014.         move.w    -3*2(a3,d0.w),d0    ;get track no
  10015.  
  10016.         move.l    buffer,a3
  10017.  
  10018.         move.l    #$55555555,d5
  10019.         move.l    d5,d6
  10020.         add.l    d6,d6            ;d6=$aaaaaaaa
  10021.  
  10022.         tst.b    format
  10023.         beq.b    .noformat
  10024.         tst.b    first_sauve
  10025.         bne.b    .fast
  10026.  
  10027. .noformat    move.w    #$1a00*2/16-1,d1
  10028. .filla        move.l    d6,(a3)+
  10029.         move.l    d6,(a3)+
  10030.         move.l    d6,(a3)+
  10031.         move.l    d6,(a3)+
  10032.         dbf    d1,.filla
  10033.  
  10034. .fast        move.l    buffer,a3
  10035.         lea.l    $1a00*2-$440*11-$20(a3),a3
  10036.  
  10037.         bsr.b    do_track
  10038.  
  10039.         st    first_sauve
  10040.         movem.l    (a7)+,a0-a3/d0-d7
  10041.         rts
  10042.  
  10043. *******************************
  10044. ;-> a3=ptr on dest track
  10045. ;-> a4=ptr on data to write
  10046. ;-> d0=no of track
  10047.  
  10048. do_track:    move.b    d0,header+1
  10049.         move.w    #$000b,header+2
  10050.         moveq    #11-1,d4
  10051. next_sec:    bsr.b    code_sector
  10052.         lea.l    $220*2(a3),a3        ;go next sector
  10053.         add.w    #$00ff,header+2        ;inc actual sec, dec sec left
  10054.         subq.w    #1,sectpos
  10055.         dbf    d4,next_sec
  10056.  
  10057.         tst.w    sectpos
  10058.         bne.b    .noend
  10059.         st    ctrl            ;set end signal
  10060. .noend        rts
  10061.  
  10062. *******************************
  10063.  
  10064. code_sector    move.l    a3,a0
  10065.         addq.l    #4,a0
  10066.         move.l    #$44894489,(a0)+    ;sync
  10067.         move.l    header,d0
  10068.         bsr.w    code
  10069.  
  10070.         lea.l    8(a3),a0
  10071.         moveq    #10,d1
  10072.         bsr.w    chk_sum
  10073.         bsr.b    code
  10074.  
  10075.         tst.b    format
  10076.         beq.b    .no_format
  10077.         lea.l    track_buffer,a4
  10078.         tst.b    first_sauve
  10079.         bne.b    .out
  10080.         moveq    #0,d0
  10081.         move.w    #512/16-1,d7
  10082. .clear        move.l    d0,(a4)+
  10083.         move.l    d0,(a4)+
  10084.         move.l    d0,(a4)+
  10085.         move.l    d0,(a4)+
  10086.         dbf    d7,.clear
  10087.         lea.l    track_buffer,a4
  10088.         move.l    #$444f5301,(a4)        ;'DOS',1 = FFS
  10089. .no_format
  10090.         addq.l    #8,a0
  10091.         moveq    #$80-1,d7
  10092. .code_sec:    move.l    (a4)+,d0
  10093.  
  10094.         move.l    d0,d3
  10095.         lsr.l    #1,d0
  10096.         bsr.w    coder2
  10097.  
  10098.         lea.l    $200-4(a0),a0
  10099.         move.l    d3,d0
  10100.         bsr.w    coder2
  10101.         lea.l    -$200(a0),a0
  10102.  
  10103.         dbf    d7,.code_sec
  10104.  
  10105.         lea.l    $40(a3),a0
  10106.         move.w    #$100,d1
  10107.         bsr.w    chk_sum2
  10108.         lea.l    $38(a3),a0
  10109.         bsr.b    code
  10110. .out        rts
  10111.  
  10112. *******************************
  10113. ; a0 = address du buffer code
  10114. ; d0 = long word to code
  10115.  
  10116. code:        movem.l    d2/d3,-(a7)
  10117.         move.l    d0,d3
  10118.         lsr.l    #1,d0
  10119.         bsr.b    coder
  10120.         move.l    d3,d0
  10121.         bsr.b    coder2
  10122.         movem.l    (a7)+,d2/d3
  10123.         rts    
  10124.  
  10125. *******************************
  10126.  
  10127. coder:        and.l    d5,d0
  10128.         move.l    d0,d2
  10129.         eor.l    d5,d2
  10130.         move.l    d2,d1
  10131.         add.l    d2,d2
  10132.         lsr.l    #1,d1
  10133.         bset    #31,d1
  10134.         and.l    d2,d1
  10135.         or.l    d1,d0
  10136.         btst    #0,-1(a0)
  10137.         beq.b    pas_bit
  10138.         bclr    #31,d0
  10139. pas_bit:    move.l    d0,(a0)+
  10140.         rts
  10141.  
  10142. *******************************
  10143.  
  10144. chk_sum:    move.l    d2,-(a7)
  10145.         subq.w    #1,d1
  10146.         moveq    #0,d0
  10147. l_chks:        move.l    (a0)+,d2
  10148.         eor.l    d2,d0
  10149.         dbf    d1,l_chks
  10150.         and.l    d5,d0
  10151.         move.l    (a7)+,d2
  10152.         rts
  10153.  
  10154. chk_sum2:    move.l    d2,-(a7)
  10155.         subq.w    #1,d1
  10156.         moveq    #0,d0
  10157. l_chks2:    move.l    (a0)+,d2
  10158.         eor.l    d2,d0
  10159.         dbf    d1,l_chks2
  10160.         move.l    (a7)+,d2
  10161.         and.l    d5,d0
  10162.         rts
  10163.  
  10164. *******************************
  10165.  
  10166. coder2:        and.l    d5,d0
  10167.         move.l    d0,d2
  10168.         eor.l    d5,d2
  10169.         move.l    d2,d1
  10170.         add.l    d2,d2
  10171.         lsr.l    #1,d1
  10172.         bset    #31,d1
  10173.         and.l    d2,d1
  10174.         or.l    d1,d0
  10175.         btst    #0,-1(a0)
  10176.         beq.b    pas_bitx
  10177.         bclr    #31,d0
  10178. pas_bitx:    move.l    d0,(a0)+
  10179.  
  10180.         move.b    (a0),d1
  10181.         btst    #0,d0
  10182.         bne.b    bit0
  10183.         btst    #6,d1
  10184.         bne.b    bit6
  10185.         bset    #7,d1
  10186.         bra.b    go7
  10187.  
  10188. bit0:        bclr    #7,d1
  10189. go7:        move.b    d1,(a0)
  10190. bit6:        rts
  10191.  
  10192. **************************************************************************
  10193. **************************************************************************
  10194.  
  10195. ;----------------------------------------------------------
  10196.  
  10197. NODISK_ERR        equ 1
  10198. TRACKCORRUPT_ERR    equ 2
  10199. BADCHECKSUM_ERR        equ 3
  10200. NOTDOS_ERR        equ 4
  10201. WRITEPROTECT_ERR    equ 5
  10202. CREATEFILE_ERR        equ 6
  10203. FILENOTFOUND_ERR    equ 7
  10204. DISKFULL_ERR        equ 8
  10205. FILEEXIST_ERR        equ 9
  10206. DEVICENOTFOUND_ERR    equ 10
  10207. ILLEGALPATH_ERR        equ 11
  10208. NOFFS_ERR        equ 12
  10209. IDE_ERR            equ 13
  10210. NOTEMPTY_ERR        equ 14
  10211.  
  10212.         STRUCTURE partition,0
  10213.         ULONG part_next        ;ptr on next partition
  10214.         ULONG part_first    ;first sector of this partition
  10215.         ULONG part_nbsec    ;nb sectors in this partition
  10216.         ULONG part_device    ;ptr on device
  10217.         UWORD part_unit        ;unit number
  10218.         ULONG part_filesystem    ;filesystem ID (DOS\0,....) 0=nodisk
  10219.         STRUCT part_name,32    ;partition_name (BCPL) (upper case)
  10220.         STRUCT part_name2,32    ;partition_name (BCPL) (original case)
  10221.         LABEL part_SIZEOF
  10222.  
  10223.         STRUCTURE file_handle,0
  10224.         ULONG file_part        ;ptr on partition
  10225.         ULONG file_parent    ;parent
  10226.         ULONG file_header
  10227.         ULONG file_extension
  10228.         ULONG file_extpos
  10229.         ULONG file_size
  10230.         ULONG file_seek
  10231.         STRUCT file_name,32    ;1st byte=len of name (max 30) (BCPL)
  10232.         UBYTE file_written
  10233.         UBYTE file_dir        ;0=it is a file, -1 it is a dir
  10234.                     ;(used by ExNext only)
  10235.         LABEL file_SIZEOF
  10236.  
  10237.  
  10238. ;-------------- device is accesed by open,read,write,close,seek... cmd ------
  10239.  
  10240. READ_CMD equ 0
  10241. WRITE_CMD equ 4
  10242. UPDATE_CMD equ 8
  10243. MOTOFF_CMD equ 12
  10244. CHANGE_CMD equ 16
  10245. READM_CMD equ 20
  10246. WRITEM_CMD equ 24
  10247.  
  10248.     OPT_OFF
  10249. floppy_device    bra.w    floppy_read
  10250.         bra.w    floppy_write
  10251.         bra.w    floppy_update
  10252.         bra.w    floppy_motoff
  10253.         bra.w    floppy_change
  10254.         bra.w    floppy_readm
  10255.         bra.w    floppy_writem
  10256.     OPT_ON
  10257.  
  10258. ;-> a3=ptr on part
  10259. ;-> d0=no of first block to read
  10260. ;-> d1=nb of block to read
  10261. ;-> on stack=ptr on blocks
  10262.  
  10263. floppy_readm    movem.l    d0-d1/a0/a4,-(a7)
  10264.         lsl.w    #2,d1
  10265.         lea.l    4+4*4(a7,d1.w),a4
  10266.         lsr.w    #2,d1
  10267.         bra.b    .godbf
  10268. .loop        move.l    -(a4),a0
  10269.         bsr    floppy_read
  10270.         addq.l    #1,d0
  10271. .godbf        dbf    d1,.loop
  10272.         movem.l    (a7)+,d0-d1/a0/a4
  10273.         lsl.w    #2,d1
  10274.         move.l    (a7),(a7,d1.w)
  10275.         lea.l    (a7,d1.w),a7
  10276.         lsr.w    #2,d1
  10277.         rts
  10278.  
  10279. ;-> a3=ptr on part
  10280. ;-> d0=no of first block to write
  10281. ;-> d1=nb of block to write
  10282. ;-> on stack=ptr on blocks
  10283.  
  10284. floppy_writem    movem.l    d0-d1/a0/a4,-(a7)
  10285.         lsl.w    #2,d1
  10286.         lea.l    4+4*4(a7,d1.w),a4
  10287.         lsr.w    #2,d1
  10288.         bra.b    .godbf
  10289. .loop        move.l    -(a4),a0
  10290.         bsr    floppy_write
  10291.         addq.l    #1,d0
  10292. .godbf        dbf    d1,.loop
  10293.         movem.l    (a7)+,d0-d1/a0/a4
  10294.         lsl.w    #2,d1
  10295.         move.l    (a7),(a7,d1.w)
  10296.         lea.l    (a7,d1.w),a7
  10297.         lsr.w    #2,d1
  10298.         rts
  10299.  
  10300. ;-> a3=ptr on part
  10301. ;-> d0=no of block to read
  10302. ;-> a0=buffer ptr
  10303.  
  10304. floppy_read    move.l    d0,-(a7)
  10305.         add.l    part_first(a3),d0
  10306.         cmp.w    #0,part_unit(a3)        ;DF0 ?
  10307.         bne.b    .no0
  10308.         cmp.w    #3,drive
  10309.         beq.b    .read
  10310.         bsr    write_flush
  10311.         move.w    #3,drive
  10312.         move.l    d0,-(a7)
  10313.         moveq    #1,d0                ;force floppy change
  10314.         bsr    floppy_change
  10315.         move.l    (a7)+,d0
  10316.         bra.b    .read
  10317.  
  10318. .no0        cmp.w    #1,part_unit(a3)        ;DF1 ?
  10319.         bne.b    .no1
  10320.         cmp.w    #4,drive
  10321.         beq.b    .read
  10322.         bsr    write_flush
  10323.         move.w    #4,drive
  10324.         move.l    d0,-(a7)
  10325.         moveq    #1,d0                ;force floppy change
  10326.         bsr    floppy_change
  10327.         move.l    (a7)+,d0
  10328.         bra.b    .read
  10329. .no1        bra.b    .err
  10330.  
  10331. .read        bsr    read_fsector
  10332. .err        move.l    (a7)+,d0
  10333.         rts
  10334.  
  10335. ;-> a3=ptr on part
  10336. ;-> d0=no of block to write
  10337. ;-> a0=buffer ptr
  10338.  
  10339. floppy_write    move.l    d0,-(a7)
  10340.  
  10341.         bsr    signal_write
  10342.  
  10343.         add.l    part_first(a3),d0
  10344.         cmp.w    #0,part_unit(a3)        ;DF0 ?
  10345.         bne.b    .no0
  10346.         cmp.w    #3,drive
  10347.         beq.b    .write
  10348.         bsr    write_flush
  10349.         move.w    #3,drive
  10350.         move.l    d0,-(a7)
  10351.         moveq    #1,d0                ;force floppy change
  10352.         bsr    floppy_change
  10353.         move.l    (a7)+,d0
  10354.         bra.b    .write
  10355.  
  10356. .no0        cmp.w    #1,part_unit(a3)        ;DF1 ?
  10357.         bne.b    .no1
  10358.         cmp.w    #4,drive
  10359.         beq.b    .write
  10360.         bsr    write_flush
  10361.         move.w    #4,drive
  10362.         move.l    d0,-(a7)
  10363.         moveq    #1,d0                ;force floppy change
  10364.         bsr    floppy_change
  10365.         move.l    (a7)+,d0
  10366.         bra.b    .write
  10367. .no1        bra.b    .err
  10368.  
  10369. .write        bsr    write_fsector
  10370. .err        move.l    (a7)+,d0
  10371.         rts
  10372.  
  10373. ;-> a3=ptr on part
  10374.  
  10375. floppy_update    bsr    write_flush
  10376.         rts
  10377.  
  10378. ;-> a3=ptr on part
  10379.  
  10380. floppy_motoff    cmp.w    #0,part_unit(a3)        ;DF0 ?
  10381.         bne.b    .no0
  10382.         cmp.w    #3,drive
  10383.         beq.b    .motoff
  10384.         bsr    write_flush
  10385.         move.w    #3,drive
  10386.         move.l    d0,-(a7)
  10387.         moveq    #1,d0                ;force floppy change
  10388.         bsr    floppy_change
  10389.         move.l    (a7)+,d0
  10390.         bra.b    .motoff
  10391.  
  10392. .no0        cmp.w    #1,part_unit(a3)        ;DF1 ?
  10393.         bne.b    .no1
  10394.         cmp.w    #4,drive
  10395.         beq.b    .motoff
  10396.         bsr    write_flush
  10397.         move.w    #4,drive
  10398.         move.l    d0,-(a7)
  10399.         moveq    #1,d0                ;force floppy change
  10400.         bsr    floppy_change
  10401.         move.l    (a7)+,d0
  10402.         bra.b    .motoff
  10403. .no1        bra.b    .err
  10404.  
  10405. .motoff        bsr    motor_off
  10406. .err        rts
  10407.  
  10408. ;-> a3=ptr on part
  10409. ;-> d0=cmd 0=test if changed 1=force change
  10410. ;<- d0 0=nochange -1=nodisk 1=newdisk
  10411.  
  10412. floppy_change    movem.l    a0,-(a7)
  10413.         tst.l    d0
  10414.         bne.w    .force
  10415.         cmp.w    #0,part_unit(a3)        ;DF0 ?
  10416.         bne.b    .no0
  10417.         cmp.w    #3,drive
  10418.         beq.w    .gochg
  10419.         bsr    write_flush
  10420.         move.w    #3,drive
  10421.         movem.l    d0/a0,-(a7)
  10422.         lea.l    track_sector,a0
  10423.         moveq    #-1,d0
  10424.         move.l    d0,(a0)+
  10425.         move.l    d0,(a0)+
  10426.         move.l    d0,(a0)+
  10427.         move.w    d0,track_buffer_no
  10428.         movem.l    (a7)+,d0/a0
  10429.         bra.b    .gochg
  10430.  
  10431. .no0        cmp.w    #1,part_unit(a3)        ;DF1 ?
  10432.         bne.b    .no1
  10433.         cmp.w    #4,drive
  10434.         beq.b    .gochg
  10435.         bsr    write_flush
  10436.         move.w    #4,drive
  10437.         movem.l    d0/a0,-(a7)
  10438.         lea.l    track_sector,a0
  10439.         moveq    #-1,d0
  10440.         move.l    d0,(a0)+
  10441.         move.l    d0,(a0)+
  10442.         move.l    d0,(a0)+
  10443.         move.w    d0,track_buffer_no
  10444.         movem.l    (a7)+,d0/a0
  10445.         bra.b    .gochg
  10446.  
  10447. .no1        bra.w    .err
  10448.  
  10449. .force        lea.l    track_sector,a0
  10450.         moveq    #-1,d0
  10451.         move.l    d0,(a0)+
  10452.         move.l    d0,(a0)+
  10453.         move.l    d0,(a0)+
  10454.         move.w    d0,track_buffer_no
  10455.         moveq    #1,d0            ;new disk
  10456.         bra.b    .out
  10457.  
  10458. .gochg        lea.l    $bfd100,a0
  10459.         move.w    drive,d0
  10460.         bclr    d0,(a0)            ;select drive
  10461.         bclr    #1,(a0)            ;step dir -> 80
  10462.         bsr    timer1
  10463.         btst    #2,$bfe001        ;/CHNG ?
  10464.         bne.b    .nochg
  10465.  
  10466.         bsr    step_head
  10467.         bset    #1,(a0)            ;step dir -> 00
  10468.         bsr    timer1
  10469.         bsr    step_head
  10470.         bsr    timer1
  10471.         btst    #2,$bfe001
  10472.         bne.b    .newdisk
  10473.         bset    d0,(a0)            ;deselect drive
  10474.         move.w    #NODISK_ERR,drive_err
  10475.         moveq    #-1,d0            ;no disk
  10476.         bra.b    .out
  10477.  
  10478. .newdisk    bset    d0,(a0)            ;deselect drive
  10479.         lea.l    track_sector,a0
  10480.         moveq    #-1,d0
  10481.         move.l    d0,(a0)+
  10482.         move.l    d0,(a0)+
  10483.         move.l    d0,(a0)+
  10484.         move.w    d0,track_buffer_no
  10485.         moveq    #1,d0            ;new disk
  10486.         bra.b    .out
  10487.  
  10488. .nochg        bset    d0,(a0)            ;deselect drive
  10489.         moveq    #0,d0            ;no change
  10490.         bra.b    .out
  10491.  
  10492. .err        moveq    #1,d0
  10493. .out        movem.l    (a7)+,a0
  10494.         rts
  10495.  
  10496.  
  10497.     OPT_OFF
  10498. ide_device    bra.w    ide_read
  10499.         bra.w    ide_write
  10500.         bra.w    ide_update
  10501.         bra.w    ide_motoff
  10502.         bra.w    ide_change
  10503.         bra.w    ide_readm
  10504.         bra.w    ide_writem
  10505.     OPT_ON
  10506.  
  10507. ;-> a3=ptr on part
  10508. ;-> d0=no of first block to read
  10509. ;-> d1=nb of block to read
  10510. ;-> on stack=ptr on blocks
  10511.  
  10512. ide_readm    movem.l    d0-d1/a0/a4,-(a7)
  10513.         lsl.w    #2,d1
  10514.         lea.l    4+4*4(a7,d1.w),a4
  10515.         lsr.w    #2,d1
  10516.         bra.b    .godbf
  10517. .loop        move.l    -(a4),a0
  10518.         bsr    ide_read
  10519.         addq.l    #1,d0
  10520. .godbf        dbf    d1,.loop
  10521.         movem.l    (a7)+,d0-d1/a0/a4
  10522.         lsl.w    #2,d1
  10523.         move.l    (a7),(a7,d1.w)
  10524.         lea.l    (a7,d1.w),a7
  10525.         lsr.w    #2,d1
  10526.         rts
  10527.  
  10528. ;-> a3=ptr on part
  10529. ;-> d0=no of first block to write
  10530. ;-> d1=nb of block to write
  10531. ;-> on stack=ptr on blocks
  10532.  
  10533.  
  10534. ide_writem    movem.l    d0-d2/a0,-(a7)
  10535.  
  10536.         bsr    signal_write
  10537.  
  10538.         add.l    part_first(a3),d0
  10539.  
  10540.         lsl.w    #2,d1
  10541.         lea.l    4+4*4(a7,d1.w),a0
  10542.         lsr.w    #2,d1
  10543.  
  10544.         move.w    d1,d2
  10545.         move.w    part_unit(a3),d1
  10546.         bsr    WriteM_Block
  10547.  
  10548.         tst.l    d0
  10549.         beq.b    .noerr
  10550. .err        move.w    #IDE_ERR,drive_err
  10551. .noerr
  10552.         movem.l    (a7)+,d0-d2/a0
  10553.         add.w    d1,d1
  10554.         add.w    d1,d1
  10555.         move.l    (a7),(a7,d1.w)
  10556.         lea.l    (a7,d1.w),a7
  10557.         lsr.w    #2,d1
  10558.         rts
  10559.  
  10560. ;-> a3 = part
  10561.  
  10562. signal_write    movem.l    d2/a0/a3,-(a7)
  10563.         lea.l    changed_disk,a0
  10564.         moveq    #16-1,d2
  10565. .seek        cmp.l    (a0)+,a3
  10566.         beq.b    .found
  10567.         dbf    d2,.seek
  10568.  
  10569.         lea.l    changed_disk,a0
  10570. .seek2        tst.l    (a0)+
  10571.         bne.b    .seek2
  10572.         move.l    a3,-4(a0)
  10573.  
  10574. .found        movem.l    (a7)+,d2/a0/a3
  10575.         rts
  10576.  
  10577.  
  10578. ;-> d0=block no
  10579. ;-> a0=address
  10580. ;-> a3=part
  10581.  
  10582. ide_read    movem.l    d0-d1,-(a7)
  10583.         cmp.l    part_nbsec(a3),d0
  10584.         bge.b    .err
  10585.         add.l    part_first(a3),d0
  10586.         move.w    part_unit(a3),d1
  10587.         bsr    Read_Block
  10588.         tst.l    d0
  10589.         beq.b    .noerr
  10590. .err        move.w    #IDE_ERR,drive_err
  10591. .noerr        movem.l    (a7)+,d0-d1
  10592.         rts
  10593.  
  10594. ;-> d0=block no
  10595. ;-> a0=address
  10596. ;-> a3=part
  10597.  
  10598. ide_write    movem.l    d0-d1,-(a7)
  10599.  
  10600.         bsr    signal_write
  10601.  
  10602.         cmp.l    part_nbsec(a3),d0
  10603.         bge.b    .err
  10604.         add.l    part_first(a3),d0
  10605.         move.w    part_unit(a3),d1
  10606.         bsr    Write_Block
  10607.         tst.l    d0
  10608.         beq.b    .noerr
  10609. .err        move.w    #IDE_ERR,drive_err
  10610. .noerr        movem.l    (a7)+,d0-d1
  10611.         rts
  10612.  
  10613. ide_update    rts
  10614. ide_motoff    rts
  10615. ide_change    moveq    #0,d0        ;no change
  10616.         rts
  10617.  
  10618. ;-------------- find the partitions on the HardDisks ------
  10619.  
  10620. find_part    movem.l    d0-a4,-(a7)
  10621.  
  10622.         lea.l    floppy0,a1
  10623. .seekend    move.l    (a1),d1
  10624.         beq.b    .endoflist
  10625.         move.l    d1,a1
  10626.         bra.b    .seekend
  10627.  
  10628. .endoflist    lea.l    secbuf,a0
  10629.         moveq    #0,d1
  10630.         bsr    Read_ID
  10631.         tst.l    d0
  10632.         bne.b    .nodrive0
  10633.         bsr    .search_part
  10634. .nodrive0
  10635.         tst.b    config_elsat
  10636.         bne.b    .nodrive1
  10637.         lea.l    secbuf,a0
  10638.         moveq    #1,d1
  10639.         bsr    Read_ID
  10640.         tst.l    d0
  10641.         bne.b    .nodrive1
  10642.         bsr    .search_part
  10643. .nodrive1
  10644.         lea.l    secbuf,a0
  10645.         moveq    #0,d1
  10646.         moveq    #0,d0
  10647.         tst.w    IDE_info0
  10648.         beq.b    .no0
  10649.         bsr    Read_Block
  10650. .no0
  10651.         movem.l    (a7)+,d0-a4
  10652.         rts
  10653.  
  10654. ;-------------- search partitions in rigid disk blocks ----
  10655.  
  10656. ;-> d1=drive no (unit)
  10657. ;-> a1=last partition
  10658.  
  10659. .search_part
  10660.         moveq    #0,d6
  10661. .seek        lea.l    secbuf,a0
  10662.         move.l    d6,d0
  10663.         bsr    Read_Block    ;read first RDSK
  10664.         cmp.l    #"RDSK",(a0)
  10665.         beq.b    .okrdsk
  10666.         addq.l    #1,d6
  10667.         cmp.l    #RDB_LOCATION_LIMIT,d6
  10668.         beq.w    .error
  10669.         bra.b    .seek
  10670. .okrdsk        move.l    rdb_CylBlocks(a0),d6
  10671.         move.l    rdb_PartitionList(a0),d0
  10672.         beq.w    .error
  10673. .read_next    moveq    #-1,d2
  10674.         cmp.l    d2,d0        ;end of list ?
  10675.         beq.w    .error
  10676.         bsr    Read_Block    ;read PART
  10677.         cmp.l    #"PART",(a0)
  10678.         bne.w    .error
  10679.         move.l    192(a0),d0
  10680.         lsr.l    #8,d0
  10681.         cmp.l    #"DOS",d0    ;Amiga DOS filesystem ?
  10682.         bne.w    .next
  10683.  
  10684.         lea.l    part_SIZEOF(a1),a2
  10685.         cmp.l    #harddisk_end,a2    ;max nb of part reached ?
  10686.         bge.w    .error
  10687.  
  10688.         move.l    a2,part_next(a1)
  10689.         move.l    a2,a1
  10690.         clr.l    part_next(a1)
  10691.  
  10692.         lea.l    pb_DriveName(a0),a2
  10693.         lea.l    part_name(a1),a3
  10694.         lea.l    part_name2(a1),a4
  10695.         clr.l    (a3)        ;clear DF1: name if needed
  10696.         moveq    #0,d2
  10697.         move.b    (a2)+,d2
  10698.         move.b    d2,(a3)+    ;copy name length
  10699.         move.b    d2,(a4)+
  10700.         bra.b    .godbf2
  10701. .copyn        move.b    (a2)+,d0
  10702.         move.b    d0,(a4)+
  10703.         bsr    upper_case
  10704.         move.b    d0,(a3)+    ;copy Partition name
  10705. .godbf2        dbf    d2,.copyn
  10706.  
  10707.         move.l    $a4(a0),d0    ;First cylinder
  10708.         mulu    d6,d0        ;d0=first sector
  10709.         move.l    d0,part_first(a1)
  10710.         move.l    $a8(a0),d2    ;last cylinder
  10711.         addq.w    #1,d2
  10712.         mulu    d6,d2        ;last sector+1
  10713.         sub.l    d0,d2
  10714.         move.l    d2,part_nbsec(a1)
  10715.         move.w    d1,part_unit(a1)
  10716.  
  10717.         move.l    #ide_device,part_device(a1)
  10718.  
  10719.         lea.l    extension,a0
  10720.         bsr    Read_Block    ;Read first sector
  10721.         move.l    (a0),part_filesystem(a1)
  10722.         lea.l    secbuf,a0
  10723.  
  10724. .next        move.l    pb_Next(a0),d0
  10725.         bne.w    .read_next
  10726.  
  10727. .error        rts
  10728.  
  10729. ;----------------------------------------------------------
  10730.  
  10731. ide_base    dc.l 0        ;$da2000 / $dd2020 / $EB8000 (A1200,A4000,CD32elsat)
  10732. ide_irq        dc.l 0        ;$da9000 / $dd3020 / $0
  10733.  
  10734. ide_data    dc.w 0
  10735. ide_error    dc.w 0
  10736. ide_feature    dc.w 0
  10737. ide_secnt    dc.w 0
  10738. ide_secnb    dc.w 0
  10739. ide_cyllo    dc.w 0
  10740. ide_cylhi    dc.w 0
  10741. ide_dhead    dc.w 0
  10742. ide_status    dc.w 0
  10743. ide_command    dc.w 0
  10744. ide_altstat    dc.w 0
  10745.  
  10746. ;$da8000+$1000 interrupt register
  10747.  
  10748. ;-> a0=ID_Buffer
  10749. ;-> d1=drive no (0/1)
  10750. ;<- d0=error 0=ok -1=an error occured (No Drive)
  10751.  
  10752. Read_ID        movem.l    d1-d2/a0-a1/a3,-(a7)
  10753.         lea.l    IDE_info0,a1
  10754.         tst.w    d1
  10755.         beq.b    .okdrive0
  10756.         lea.l    IDE_info1,a1
  10757. .okdrive0
  10758.         move.l    ide_base(pc),a3
  10759.  
  10760.         move.b    #0,$bfe801
  10761. .wait        cmp.b    #80,$bfe801
  10762.         bhi.w    .error
  10763.         move.w    ide_status,d0
  10764.         tst.b    (a3,d0.w)
  10765.         bmi.b    .wait            ;BUSY ?
  10766.  
  10767.         lsl.b    #4,d1
  10768.         and.b    #$10,d1            ;Drive bit
  10769.         or.b    #$a0,d1
  10770.         move.w    ide_dhead,d0
  10771.         move.b    d1,(a3,d0.w)
  10772.         move.w    ide_command,d0
  10773.         move.b    #$EC,(a3,d0.w)        ;Identify Drive cmd
  10774.  
  10775.         bsr    wait_irq2
  10776.         bne.b    .error
  10777.  
  10778.         move.w    ide_status,d0
  10779.         move.b    (a3,d0.w),d0
  10780.         btst    #0,d0
  10781.         bne.b    .error
  10782.  
  10783.         movem.l    a0/a1,-(a7)
  10784.         move.w    ide_data,d0
  10785.         lea.l    (a3,d0.w),a1
  10786.         move.w    #512/2-1,d0
  10787. .copy        move.w    (a1),d1
  10788.         ror.w    #8,d1            ;LittleEndian to BigEndian
  10789.         move.w    d1,(a0)+
  10790.         dbf    d0,.copy
  10791.         movem.l    (a7)+,a0/a1
  10792.  
  10793.         move.w    1*2(a0),II_NbCyl(a1)
  10794.         move.w    3*2(a0),II_NbHeads(a1)
  10795.         move.w    6*2(a0),II_NbSecTrack(a1)
  10796.         moveq    #0,d1
  10797.         move.w    59*2(a0),d0
  10798.         btst    #8,d0            ;setting valid ?
  10799.         beq.b    .nomult
  10800.         move.b    d0,d1
  10801. .nomult        move.w    d1,II_MultSize(a1)
  10802.  
  10803.         move.w    ide_status,d0
  10804.         move.b    (a3,d0.w),d0
  10805.         btst    #0,d0
  10806.         bne.b    .error
  10807.         moveq    #0,d0
  10808.         bra.b    .out
  10809. .error        moveq    #-1,d0
  10810. .out        movem.l    (a7)+,d1-d2/a0-a1/a3
  10811.         rts
  10812.  
  10813. ;-> a3=ide_base
  10814. wait_irq    movem.l    d0/a0,-(a7)
  10815.         tst.l    ide_irq
  10816.         bne.b    .nocd32
  10817.         move.w    ide_altstat,d0
  10818. .busy        tst.b    (a3,d0.w)
  10819.         bmi.b    .busy
  10820.         move.w    ide_status,d0
  10821.         move.b    (a3,d0.w),d0        ;ack int
  10822.         bra.b    .ok
  10823. .nocd32
  10824. .noirq        move.l    ide_irq(pc),a0
  10825.         move.b    (a0),d0
  10826.         bpl.b    .noirq
  10827.         tst.b    config_A1200
  10828.         bne.b    .go1200
  10829.         move.w    ide_status,d0
  10830.         move.b    (a3,d0.w),d0
  10831.         bra.b    .ok
  10832. .go1200        move.w    SR,-(a7)
  10833.         move.w    #$2700,sr
  10834.         move.w    ide_status,d0
  10835.         move.b    (a3,d0.w),d0
  10836.         move.b    (a0),d0
  10837.         andi.b    #3,d0
  10838.         or.b    #$7c,d0
  10839.         move.b    d0,(a0)
  10840.         move.w    (a7)+,SR
  10841. .ok
  10842.         movem.l    (a7)+,d0/a0
  10843.         rts
  10844.  
  10845.  
  10846. ;same as wait_irq but doesn't wait more than 80 ticks
  10847. ;-> a3=ide_base
  10848. ;<- Z flag RESULT unset=ERROR set=OK
  10849.  
  10850. wait_irq2    movem.l    d0/a0,-(a7)
  10851.  
  10852.         tst.l    ide_irq
  10853.         bne.b    .nocd32
  10854.         move.b    #0,$bfe801
  10855. .loop        cmp.b    #80,$bfe801
  10856.         bhi.w    .err
  10857.         move.w    ide_altstat,d0
  10858.         move.b    (a3,d0.w),d0
  10859.         bpl.b    .ok2
  10860.         bra.b    .loop
  10861. .ok2        move.w    ide_status,d0
  10862.         move.b    (a3,d0.w),d0        ;ack int
  10863.         btst    #0,d0
  10864.         bne.w    .err
  10865.         jmp    .ok
  10866.  
  10867. .nocd32
  10868.         move.b    #0,$bfe801
  10869. .noirq        cmp.b    #80,$bfe801
  10870.         bhi.b    .err
  10871.         move.l    ide_irq(pc),a0
  10872.         move.b    (a0),d0
  10873.         bpl.b    .noirq
  10874.         tst.b    config_A1200
  10875.         bne.b    .go1200
  10876.         move.w    ide_status,d0
  10877.         move.b    (a3,d0.w),d0
  10878.         bra.b    .ok
  10879. .go1200        move.w    SR,-(a7)
  10880.         move.w    #$2700,sr
  10881.         move.w    ide_status,d0
  10882.         move.b    (a3,d0.w),d0
  10883.         move.b    (a0),d0
  10884.         andi.b    #3,d0
  10885.         or.b    #$7c,d0
  10886.         move.b    d0,(a0)
  10887.         move.w    (a7)+,SR
  10888. .ok        moveq    #0,d0
  10889.         movem.l    (a7)+,d0/a0
  10890.         rts
  10891.  
  10892. .err        moveq    #-1,d0
  10893.         movem.l    (a7)+,d0/a0
  10894.         rts
  10895.  
  10896.  
  10897. ;-> d0=block no
  10898. ;-> d1=drive no (0/1)
  10899. ;-> a0=dest address
  10900.  
  10901. Read_Block    movem.l    d1-d2/a0-a1/a3,-(a7)
  10902.  
  10903.         lea.l    IDE_info0,a1
  10904.         tst.w    d1
  10905.         beq.b    .okdrive0
  10906.         lea.l    IDE_info1,a1
  10907. .okdrive0
  10908.         tst.w    (a1)            ;drive exists ?
  10909.         beq.w    .error
  10910.  
  10911.         move.l    ide_base(pc),a3
  10912.  
  10913. .wait        move.w    ide_status,d2
  10914.         tst.b    (a3,d2.w)
  10915.         bmi.b    .wait            ;BUSY ?
  10916.  
  10917.         lsl.b    #4,d1
  10918.         and.b    #$10,d1            ;Drive bit
  10919.         or.b    #$a0,d1
  10920.  
  10921.         move.w    II_NbHeads(a1),d2    ;nb_heads
  10922.         mulu    II_NbSecTrack(a1),d2    ;*nb_sectrack d2=nb sec/cyl
  10923.         tst.w    d2
  10924.         beq.w    .error
  10925.         divu    d2,d0            ;d0=cyl no.
  10926.         cmp.w    II_NbCyl(a1),d0        ;nb_cyl
  10927.         bge.w    .error
  10928.  
  10929.         move.w    ide_cyllo,d2
  10930.         move.b    d0,(a3,d2.w)
  10931.         lsr.w    #8,d0
  10932.         move.w    ide_cylhi,d2
  10933.         move.b    d0,(a3,d2.w)
  10934.         clr.w    d0
  10935.         swap    d0
  10936.         divu    II_NbSecTrack(a1),d0    ;/nb_sectrack d0=no of head
  10937.         and.w    #%1111,d0
  10938.         or.b    d0,d1
  10939.         swap    d0
  10940.         cmp.w    II_NbSecTrack(a1),d0    ;nb_sectrack
  10941.         bge.w    .error
  10942.         addq.b    #1,d0
  10943.         move.w    ide_secnb,d2
  10944.         move.b    d0,(a3,d2.w)        ;start sector
  10945.  
  10946.         move.w    ide_dhead,d2
  10947.         move.b    d1,(a3,d2.w)
  10948.         move.w    ide_secnt,d2
  10949.         move.b    #1,(a3,d2.w)        ;read 1 sector
  10950.  
  10951.         move.w    ide_command,d2
  10952.         move.b    #$20,(a3,d2.w)        ;Read Drive cmd
  10953.  
  10954.         bsr    wait_irq
  10955.  
  10956.         move.w    ide_status,d0
  10957.         move.b    (a3,d0.w),d0
  10958.         btst    #0,d0
  10959.         bne.b    .error
  10960.  
  10961.         move.w    ide_data,d0
  10962.         lea.l    (a3,d0.w),a1
  10963.         move.w    #512/32-1,d0
  10964. .read        move.w    (a1),(a0)+
  10965.         move.w    (a1),(a0)+
  10966.         move.w    (a1),(a0)+
  10967.         move.w    (a1),(a0)+
  10968.         move.w    (a1),(a0)+
  10969.         move.w    (a1),(a0)+
  10970.         move.w    (a1),(a0)+
  10971.         move.w    (a1),(a0)+
  10972.         move.w    (a1),(a0)+
  10973.         move.w    (a1),(a0)+
  10974.         move.w    (a1),(a0)+
  10975.         move.w    (a1),(a0)+
  10976.         move.w    (a1),(a0)+
  10977.         move.w    (a1),(a0)+
  10978.         move.w    (a1),(a0)+
  10979.         move.w    (a1),(a0)+
  10980.         dbf    d0,.read
  10981.  
  10982.         move.w    ide_status,d0
  10983.         move.b    (a3,d0.w),d0
  10984.         btst    #0,d0
  10985.         bne.b    .error
  10986.         moveq    #0,d0
  10987.         bra.b    .out
  10988. .error        moveq    #-1,d0
  10989. .out        movem.l    (a7)+,d1-d2/a0-a1/a3
  10990.         rts
  10991.  
  10992.  
  10993. ;-> d0=block no
  10994. ;-> d1=drive no (0/1)
  10995. ;-> a0=source address
  10996.  
  10997. Write_Block    movem.l    d1-d2/a0-a1/a3,-(a7)
  10998.  
  10999.         lea.l    IDE_info0,a1
  11000.         tst.w    d1
  11001.         beq.b    .okdrive0
  11002.         lea.l    IDE_info1,a1
  11003. .okdrive0
  11004.         tst.w    (a1)            ;drive exists ?
  11005.         beq.w    .error
  11006.  
  11007.         move.l    ide_base(pc),a3
  11008.  
  11009. .wait        move.w    ide_status,d2
  11010.         tst.b    (a3,d2.w)
  11011.         bmi.b    .wait            ;BUSY ?
  11012.  
  11013.         lsl.b    #4,d1
  11014.         and.b    #$10,d1            ;Drive bit
  11015.         or.b    #$a0,d1
  11016.  
  11017.         move.w    II_NbHeads(a1),d2    ;nb_heads
  11018.         mulu    II_NbSecTrack(a1),d2    ;*nb_sectrack d2=nb sec/cyl
  11019.         divu    d2,d0            ;d0=cyl no.
  11020.         tst.w    d2
  11021.         beq.w    .error
  11022.         cmp.w    II_NbCyl(a1),d0        ;nb_cyl
  11023.         bge.w    .error
  11024.  
  11025.         move.w    ide_cyllo,d2
  11026.         move.b    d0,(a3,d2.w)
  11027.         lsr.w    #8,d0
  11028.         move.w    ide_cylhi,d2
  11029.         move.b    d0,(a3,d2.w)
  11030.         clr.w    d0
  11031.         swap    d0
  11032.         divu    II_NbSecTrack(a1),d0    ;/nb_sectrack d0=no of head
  11033.         and.w    #%1111,d0
  11034.         or.b    d0,d1
  11035.         swap    d0
  11036.         cmp.w    II_NbSecTrack(a1),d0    ;nb_sectrack
  11037.         bge.w    .error
  11038.         addq.b    #1,d0
  11039.         move.w    ide_secnb,d2
  11040.         move.b    d0,(a3,d2.w)        ;start sector
  11041.  
  11042.         move.w    ide_dhead,d2
  11043.         move.b    d1,(a3,d2.w)
  11044.         move.w    ide_secnt,d2
  11045.         move.b    #1,(a3,d2.w)        ;read 1 sector
  11046.  
  11047.         move.w    ide_command,d2
  11048.         move.b    #$30,(a3,d2.w)        ;Write Drive cmd
  11049.  
  11050. .busy        move.w    ide_status,d0
  11051.         move.b    (a3,d0.w),d0
  11052.         bmi.b    .busy
  11053.         btst    #0,d0
  11054.         bne.b    .error
  11055.         btst    #3,d0            ;DRQ ?
  11056.         beq.b    .busy
  11057.  
  11058.         move.w    ide_data,d0
  11059.         lea.l    (a3,d0.w),a1
  11060.         move.w    #512/32-1,d0
  11061. .write        move.w    (a0)+,(a1)
  11062.         move.w    (a0)+,(a1)
  11063.         move.w    (a0)+,(a1)
  11064.         move.w    (a0)+,(a1)
  11065.         move.w    (a0)+,(a1)
  11066.         move.w    (a0)+,(a1)
  11067.         move.w    (a0)+,(a1)
  11068.         move.w    (a0)+,(a1)
  11069.         move.w    (a0)+,(a1)
  11070.         move.w    (a0)+,(a1)
  11071.         move.w    (a0)+,(a1)
  11072.         move.w    (a0)+,(a1)
  11073.         move.w    (a0)+,(a1)
  11074.         move.w    (a0)+,(a1)
  11075.         move.w    (a0)+,(a1)
  11076.         move.w    (a0)+,(a1)
  11077.         dbf    d0,.write
  11078.  
  11079.         bsr    wait_irq
  11080.  
  11081. .busy2        move.w    ide_status,d0
  11082.         move.b    (a3,d0.w),d0
  11083.         btst    #0,d0
  11084.         bne.b    .error
  11085.         btst    #7,d0
  11086.         bne.b    .busy2
  11087.         moveq    #0,d0
  11088.         bra.b    .out
  11089. .error        moveq    #-1,d0
  11090. .out        movem.l    (a7)+,d1-d2/a0-a1/a3
  11091.         rts
  11092.  
  11093. ;-> d0=block no
  11094. ;-> d1=drive no (0/1)
  11095. ;-> d2=nb ok blocks to write
  11096. ;-> a0=ptr on top of stack of source address
  11097.  
  11098.  
  11099. WriteM_Block    movem.l    d1-d3/a0-a3,-(a7)
  11100.  
  11101.         lea.l    IDE_info0,a1
  11102.         tst.w    d1
  11103.         beq.b    .okdrive0
  11104.         lea.l    IDE_info1,a1
  11105. .okdrive0
  11106.         tst.w    d2
  11107.         beq.w    .error
  11108.  
  11109.         tst.w    (a1)            ;drive exists ?
  11110.         beq.w    .error
  11111.  
  11112.         move.l    ide_base(pc),a3
  11113.  
  11114. .wait        move.w    ide_status,d3
  11115.         tst.b    (a3,d3.w)
  11116.         bmi.b    .wait            ;BUSY ?
  11117.  
  11118.         lsl.b    #4,d1
  11119.         and.b    #$10,d1            ;Drive bit
  11120.         or.b    #$a0,d1
  11121.  
  11122.         move.w    II_NbHeads(a1),d3    ;nb_heads
  11123.         mulu    II_NbSecTrack(a1),d3    ;*nb_sectrack d3=nb sec/cyl
  11124.         tst.w    d3
  11125.         beq.w    .error
  11126.         divu    d3,d0            ;d0=cyl no.
  11127.         cmp.w    II_NbCyl(a1),d0        ;nb_cyl
  11128.         bge.w    .error
  11129.  
  11130.         move.w    ide_cyllo,d3
  11131.         move.b    d0,(a3,d3.w)
  11132.         lsr.w    #8,d0
  11133.         move.w    ide_cylhi,d3
  11134.         move.b    d0,(a3,d3.w)
  11135.         clr.w    d0
  11136.         swap    d0
  11137.         divu    II_NbSecTrack(a1),d0    ;/nb_sectrack d0=no of head
  11138.         and.w    #%1111,d0
  11139.         or.b    d0,d1
  11140.         swap    d0
  11141.         cmp.w    II_NbSecTrack(a1),d0    ;nb_sectrack
  11142.         bge.w    .error
  11143.         addq.b    #1,d0
  11144.         move.w    ide_secnb,d3
  11145.         move.b    d0,(a3,d3.w)        ;start sector
  11146.  
  11147.         move.w    ide_dhead,d3
  11148.         move.b    d1,(a3,d3.w)
  11149.  
  11150.         move.w    ide_secnt,d3
  11151.         move.b    d2,(a3,d3.w)        ;write d2 sectors
  11152.  
  11153.         moveq    #$30,d0            ;WriteSector
  11154.         move.w    ide_command,d3
  11155.         move.b    d0,(a3,d3.w)        ;Drive cmd
  11156.  
  11157.         subq.w    #1,d2            ;for dbf
  11158.  
  11159. .busy        move.w    ide_status,d0
  11160.         move.b    (a3,d0.w),d0
  11161.         bmi.b    .busy
  11162.         btst    #0,d0
  11163.         bne.b    .error
  11164.         btst    #3,d0            ;DRQ ?
  11165.         beq.b    .busy
  11166.  
  11167.         move.l    -(a0),a2        ;get next block address
  11168.  
  11169.         move.w    ide_data,d0
  11170.         lea.l    (a3,d0.w),a1
  11171.  
  11172.         move.w    #512/32-1,d0
  11173. .write        move.w    (a2)+,(a1)
  11174.         move.w    (a2)+,(a1)
  11175.         move.w    (a2)+,(a1)
  11176.         move.w    (a2)+,(a1)
  11177.         move.w    (a2)+,(a1)
  11178.         move.w    (a2)+,(a1)
  11179.         move.w    (a2)+,(a1)
  11180.         move.w    (a2)+,(a1)
  11181.         move.w    (a2)+,(a1)
  11182.         move.w    (a2)+,(a1)
  11183.         move.w    (a2)+,(a1)
  11184.         move.w    (a2)+,(a1)
  11185.         move.w    (a2)+,(a1)
  11186.         move.w    (a2)+,(a1)
  11187.         move.w    (a2)+,(a1)
  11188.         move.w    (a2)+,(a1)
  11189.         dbf    d0,.write
  11190.  
  11191.         bsr    wait_irq
  11192.  
  11193.         dbf    d2,.busy
  11194.  
  11195. .busy2        move.w    ide_status,d0
  11196.         move.b    (a3,d0.w),d0
  11197.         btst    #0,d0
  11198.         bne.b    .error
  11199.         btst    #7,d0
  11200.         bne.b    .busy2
  11201.         moveq    #0,d0
  11202.         bra.b    .out
  11203. .error        moveq    #-1,d0
  11204. .out        movem.l    (a7)+,d1-d3/a0-a3
  11205.         rts
  11206.  
  11207. ****************************************************************
  11208.  
  11209.         include src/file.s
  11210.         include src/fbuffers.s
  11211.         include src/cmd_p.s
  11212.         include src/cmd_sp.s
  11213.  
  11214. **************************************************************************
  11215. ;-------------- read the palette from custom registers -------------------
  11216.  
  11217. read_palette    movem.l    d0-d2/a0-a1,-(a7)
  11218.         tst.b    config_AGA
  11219.         beq.b    .noaga
  11220.         move.w    #$0100,$104(a6)        ;set read mode
  11221.         lea.l    paletteL,a0
  11222.         move.w    #$200,d0
  11223.         moveq    #8-1,d1
  11224. .loop_bank    move.w    d0,$106(a6)
  11225.         lea.l    $180(a6),a1
  11226.         moveq    #32-1,d2
  11227. .color        move.w    (a1)+,(a0)+        ;copy bank
  11228.         dbf    d2,.color
  11229.         add.w    #$2000,d0
  11230.         dbf    d1,.loop_bank
  11231.  
  11232.         lea.l    paletteH,a0
  11233.         moveq    #0,d0
  11234.         moveq    #8-1,d1
  11235. .loop_bank2    move.w    d0,$106(a6)
  11236.         lea.l    $180(a6),a1
  11237.         moveq    #32-1,d2
  11238. .color2        move.w    (a1)+,(a0)+        ;copy bank
  11239.         dbf    d2,.color2
  11240.         add.w    #$2000,d0
  11241.         dbf    d1,.loop_bank2
  11242.         move.w    #0,$104(a6)        ;set write mode
  11243. .noaga        movem.l    (a7)+,d0-d2/a0-a1
  11244.         rts
  11245.  
  11246. restore_palette    movem.l    d0-d2/a0-a1,-(a7)
  11247.         tst.b    config_AGA
  11248.         beq.b    .noaga
  11249.  
  11250.         lea.l    paletteH,a0
  11251.         moveq    #0,d0
  11252.         moveq    #8-1,d1
  11253. .loop_bank2    move.w    d0,$106(a6)
  11254.         lea.l    $180(a6),a1
  11255.         moveq    #32-1,d2
  11256. .color2        move.w    (a0)+,(a1)+        ;copy bank
  11257.         dbf    d2,.color2
  11258.         add.w    #$2000,d0
  11259.         dbf    d1,.loop_bank2
  11260.  
  11261.         lea.l    paletteL,a0
  11262.         move.w    #$200,d0
  11263.         moveq    #8-1,d1
  11264. .loop_bank    move.w    d0,$106(a6)
  11265.         lea.l    $180(a6),a1
  11266.         moveq    #32-1,d2
  11267. .color        move.w    (a0)+,(a1)+        ;copy bank
  11268.         dbf    d2,.color
  11269.         add.w    #$2000,d0
  11270.         dbf    d1,.loop_bank
  11271.  
  11272.         move.w    custom+$10c,$10c(a6)    ;for palette EOR
  11273.  
  11274.         move.w    #0,$106(a6)
  11275.  
  11276. .noaga        movem.l    (a7)+,d0-d2/a0-a1
  11277.         rts
  11278.  
  11279.  
  11280. **************************************************************************
  11281. ;-------------- SCAN scan memory for samples -----------------------------
  11282.  
  11283. cmd_scan    jmp    end_command
  11284.  
  11285. **************************************************************************
  11286. *************** MMU routines *********************************************
  11287. **************************************************************************
  11288.  
  11289. ;set a page mode
  11290. ;-> a0 address
  11291. ;-> mode 0=normal, 1=write protected, read/write protected
  11292. ;<- d0 error (0=ok)
  11293.  
  11294.  
  11295. mmu_set_page:
  11296.         cmp.w    #4,proc_type
  11297.         blt.b    .err
  11298.  
  11299. ;-------------- 68040/68060 MMU -----------
  11300.         nop
  11301.  
  11302. .err        moveq    #-1,d0
  11303.         rts
  11304.  
  11305. **************************************************************************
  11306. ;--------------
  11307. ; shows the reason because HrtMon was entered
  11308. ; it will only output something if the reason is different than
  11309. ; NMI and PORTS
  11310. ; IN:    - a0 = stackframe
  11311. ; OUT:    -
  11312.  
  11313. _ShowEntryReason
  11314.         movem.l    d0-a6,-(a7)
  11315.         moveq    #1,d0
  11316.         cmp.w    proc_type,d0
  11317.         bhs    .end
  11318.         moveq    #0,d0
  11319.         move.w    (6,a0),d0        ;format
  11320.         cmp.w    #$68,d0            ;keyboard
  11321.         beq    .end
  11322.         cmp.w    #$7c,d0            ;NMI
  11323.         beq    .end
  11324.         lea    .str,a0
  11325.         bsr    print
  11326.         moveq    #4,d1
  11327.         bsr    print_hex
  11328.         lea    .spc,a0
  11329.         bsr    print
  11330.         and.w    #$fff,d0
  11331.         lsr.w    #2,d0
  11332.         lea    _exceptionnames,a0
  11333.         bsr    _DoStringNull
  11334.         move.l    d0,a0
  11335.         tst.l    d0
  11336.         bne    .known
  11337.         lea    .unknown,a0
  11338. .known        bsr    print
  11339.         bsr    _PrintLn
  11340. .end        movem.l    (a7)+,d0-a6
  11341.         rts
  11342.  
  11343. .str        dc.b    "$",0
  11344. .spc        dc.b    " ",0
  11345. .unknown    dc.b    "undefined entry into HrtMon",0
  11346.         even
  11347.  
  11348. ;--------------
  11349. ; prints a newline
  11350. ; IN:    -
  11351. ; OUT:    -
  11352.  
  11353. _PrintLn    lea    .lf,a0
  11354.         bra    print
  11355.  
  11356. .lf        dc.b    10,0
  11357.  
  11358. **************************************************************************
  11359.  
  11360.         include src/disassemble.s
  11361.         include src/assemble.s
  11362.  
  11363. ;make a copy of registers for disassemble function
  11364.  
  11365. init_regBMON    lea.l    regsBMON,a1
  11366.         lea.l    registres,a0
  11367.         moveq    #16-1,d0
  11368. .copy        move.l    (a0)+,(a1)+
  11369.         dbf    d0,.copy
  11370.         move.l    usp_reg,(a1)+
  11371.         move.l    isp_reg,(a1)+
  11372.         move.l    msp_reg,(a1)+
  11373.         move.l    vbr_reg,(a1)+
  11374.         move.l    cacr_reg,(a1)+
  11375.         move.l    caar_reg,(a1)+
  11376.         move.l    pc_reg,(a1)+
  11377.         moveq    #0,d0
  11378.         move.w    sr_reg,d0
  11379.         move.l    d0,(a1)+
  11380.         rts
  11381.  
  11382. ************************************************************
  11383.  
  11384.         include src/keymaps.s
  11385.  
  11386. ;----------------------------------------------------------------------------
  11387.  
  11388. ascII        dc.b "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz "
  11389.         dc.b "0123456789+",'"'
  11390.         dc.b "*ç%&/()=?'!$#-,;:[]<>@.éàèöäü",$5c,"|§°_¹²{} "
  11391. end_ascII
  11392.  
  11393. ;--- special ascII -------
  11394. ; '¹' = continous line
  11395. ; '²' = small dot
  11396.  
  11397. ;----------------------------------------------------------------------------
  11398.  
  11399. ascIIx        dcb.b $20,"²"
  11400.         dc.b ' !"£$%&',"'()*+,-./0123456789:;<=>?@"
  11401.         dc.b "ABCDEFGHIJKLMNOPQRSTUVWXYZ[",$5c,"]^_²"
  11402.         dc.b "abcdefghijklmnopqrstuvwxyz"
  11403.         dc.b "{|}²çüé²äà²ç²²è"
  11404.         dcb.b 256,"²"
  11405.         even
  11406.  
  11407. hex_list    dc.b "0123456789ABCDEF"
  11408.  
  11409.         cnop 0,4
  11410. ascII_conv    dcb.b 256,0
  11411.  
  11412.  
  11413. file_len_txt    dc.b "File length=$",0
  11414. BP_enter_txt    dc.b "Break Point reached at address $",0
  11415. BPJ_enter_txt    dc.b "JSR Break Point reached at address $",0
  11416. BP_set_txt    dc.b "Break Point set at address $",0
  11417. BPJ_set_txt    dc.b "JSR Break Point set at address $",0
  11418. BP_clr_txt    dc.b "Break Point removed at address $",0
  11419. all_break_txt    dc.b "Break Point at $",0
  11420. all_break2_txt    dc.b "JSR Break Point at $",0
  11421. all_BP_txt    dc.b "All Break Points cleared",$a,0
  11422. show_txt    dc.b "memory address : $",0
  11423. break_txt    dc.b "Break...",$a,0
  11424. drive_txt    dc.b "Active drive is now : ",0
  11425. no_disk_txt    dc.b "No disk in drive ...",$a,0
  11426. corrupt_txt    dc.b "Track corrupted ...",$a,0
  11427. bad_sum_txt    dc.b "Bad Block_Checksum ...",$a,0
  11428. NotDOS_txt    dc.b "Not a DOS disk ...",$a,0
  11429. WriteProt_txt    dc.b "Disk is write-protected ...",$a,0
  11430. Bitmap_txt    dc.b "Invalid Bitmap ...",$a,0
  11431.  
  11432. NotEmpty_txt        dc.b "Directory not empty ...",$a,0
  11433. IDEerr_txt        dc.b "IDE disk error ...",$a,0
  11434. NoFFS_txt        dc.b "Not an FFS or Int. FFS disk ...",$a
  11435.             dc.b "(OFS and DC-FFS not supported)",$a,0
  11436. IllegalPath_txt        dc.b "Illegal path ...",$a,0
  11437. DeviceNotFound_txt    dc.b "Device not found ...",$a,0
  11438. FileExists_txt        dc.b "File already exists ...",$a,0
  11439. DiskFull_txt        dc.b "Disk full ...",$a,0
  11440. FileNotFound_txt    dc.b "File not found ...",$a,0
  11441. CreateFile_txt        dc.b "Can't create file ...",$a,0
  11442.  
  11443.  
  11444. unknown_txt        dc.b "Unknown command...",$a,0
  11445. illegal_syntax_txt    dc.b "Illegal syntax...",$a,0
  11446. illegal_addr_txt    dc.b "Illegal address...",$a,0
  11447. illegal_reg_txt        dc.b "Illegal register...",$a,0
  11448. illegal_val_txt        dc.b "Illegal value...",$a,0
  11449. illegal_name_txt    dc.b "Illegal name...",$a,0
  11450. illegal_string_txt    dc.b "Illegal string...",$a,0
  11451. illegal_expr_txt    dc.b "Illegal expression...",$a,0
  11452. not_found_txt        dc.b "File not found...",$a,0
  11453. too_break_txt        dc.b "Too many break points...",$a,0
  11454. insert_off_txt        dc.b "off"
  11455. insert_on_txt        dc.b "on "
  11456.  
  11457. outerr_txt    dc.b "Wrong register number...",$a,0
  11458.  
  11459.         include src/help.s
  11460.  
  11461. ;--------------------------------------------------------------------
  11462.  
  11463. topaz2        incbin "topaz3.raw"
  11464.         ;880*10 Main Font
  11465.  
  11466.         cnop 0,4
  11467.  
  11468. ***********************************************************
  11469.  
  11470.  
  11471. ascII_mac    macro
  11472.         dcb.b 80*(MAX_SCREEN-3),' '        ;fill with spc.
  11473.         dc.b "¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹"
  11474.         dc.b "¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹"
  11475.         dc.b "HRTmon V"
  11476.         version
  11477.         dc.b " by Alain Malek                         "
  11478.         dc.b "                      "
  11479.  
  11480.         dc.b \1
  11481.         dc.b "Track:[00] Drive:[0] Address:[$00000000]"
  11482.         dc.b " Hrt:[$00000000] Fcpu:[65802]  Ins:[Off]"
  11483.  
  11484.  
  11485.         even
  11486.         endm
  11487.  
  11488. *****************************************************************************
  11489. ;----------------------------------------
  11490. ; names of exception/interrupt vectors
  11491. ; for using with _DoString
  11492.  
  11493. _exceptionnames
  11494. .exlist        dc.w    2        ;first
  11495.         dc.w    61        ;last
  11496.         dc.l    0        ;next list
  11497.         dc.w    .buserr-.exlist        ;#2
  11498.         dc.w    .adderr-.exlist
  11499.         dc.w    .illinst-.exlist
  11500.         dc.w    .div-.exlist
  11501.         dc.w    .chk-.exlist
  11502.         dc.w    .trapv-.exlist
  11503.         dc.w    .priv-.exlist
  11504.         dc.w    .trace-.exlist
  11505.         dc.w    .linea-.exlist        ;#10
  11506.         dc.w    .linef-.exlist        ;#11
  11507.         dc.w    .emu-.exlist
  11508.         dc.w    .co-.exlist        ;#13
  11509.         dc.w    .fmt-.exlist
  11510.         dc.w    .nii-.exlist
  11511.         dcb.w    8,0
  11512.         dc.w    .spi-.exlist        ;#24
  11513.         dc.w    .au1-.exlist
  11514.         dc.w    .au2-.exlist
  11515.         dc.w    .au3-.exlist
  11516.         dc.w    .au4-.exlist
  11517.         dc.w    .au5-.exlist
  11518.         dc.w    .au6-.exlist
  11519.         dc.w    .nmi-.exlist
  11520.         dc.w    .t0-.exlist        ;#32
  11521.         dc.w    .t1-.exlist
  11522.         dc.w    .t2-.exlist
  11523.         dc.w    .t3-.exlist
  11524.         dc.w    .t4-.exlist
  11525.         dc.w    .t5-.exlist
  11526.         dc.w    .t6-.exlist
  11527.         dc.w    .t7-.exlist
  11528.         dc.w    .t8-.exlist
  11529.         dc.w    .t9-.exlist
  11530.         dc.w    .t10-.exlist
  11531.         dc.w    .t11-.exlist
  11532.         dc.w    .t12-.exlist
  11533.         dc.w    .t13-.exlist
  11534.         dc.w    .t14-.exlist
  11535.         dc.w    .t15-.exlist
  11536.         dc.w    .fbra-.exlist
  11537.         dc.w    .fir-.exlist
  11538.         dc.w    .fdiv-.exlist
  11539.         dc.w    .fuf-.exlist
  11540.         dc.w    .foe-.exlist
  11541.         dc.w    .fof-.exlist
  11542.         dc.w    .fnan-.exlist
  11543.         dc.w    .fudt-.exlist
  11544.         dc.w    .mmucfg-.exlist
  11545.         dc.w    .51io-.exlist
  11546.         dc.w    .51alv-.exlist
  11547.         dc.w    0
  11548.         dc.w    .uea-.exlist        ;#60
  11549.         dc.w    .ui-.exlist        ;#61
  11550. .buserr        dc.b    "Access Fault",0
  11551. .adderr        dc.b    "Address Error",0
  11552. .illinst    dc.b    "Illegal Instruction",0
  11553. .div        dc.b    "Integer Divide by Zero",0
  11554. .chk        dc.b    "CHK,CHK2 Instruction",0
  11555. .trapv        dc.b    "TRAPV,TRAPcc,cpTRAPcc Instruction",0
  11556. .priv        dc.b    "Privilege Violation",0
  11557. .trace        dc.b    "Trace",0
  11558. .linea        dc.b    "Line 1010 Emulator",0
  11559. .linef        dc.b    "Line 1111 Emulator",0
  11560. .emu        dc.b    "Emulator Interrupt",0            ;68060
  11561. .co        dc.b    "Coprocessor Protocol Violation",0    ;68020/68030
  11562. .fmt        dc.b    "Stackframe Format Error",0
  11563. .nii        dc.b    "Uninitialized Interrupt",0
  11564. .spi        dc.b    "Spurious Interrupt",0
  11565. .au1        dc.b    "Level 1 Autovector (TBE/DSKBLK/SOFT)",0
  11566. .au2        dc.b    "Level 2 Autovector (CIA-A/EXT)",0
  11567. .au3        dc.b    "Level 3 Autovector (COPPER/VBLANK/BLITTER)",0
  11568. .au4        dc.b    "Level 4 Autovector (AUDIO0-3)",0
  11569. .au5        dc.b    "Level 5 Autovector (RBF/DSKSYNC)",0
  11570. .au6        dc.b    "Level 6 Autovector (CIA-B/EXT)",0
  11571. .nmi        dc.b    "NMI Autovector",0
  11572. .t0        dc.b    "TRAP #0",0
  11573. .t1        dc.b    "TRAP #1",0
  11574. .t2        dc.b    "TRAP #2",0
  11575. .t3        dc.b    "TRAP #3",0
  11576. .t4        dc.b    "TRAP #4",0
  11577. .t5        dc.b    "TRAP #5",0
  11578. .t6        dc.b    "TRAP #6",0
  11579. .t7        dc.b    "TRAP #7",0
  11580. .t8        dc.b    "TRAP #8",0
  11581. .t9        dc.b    "TRAP #9",0
  11582. .t10        dc.b    "TRAP #10",0
  11583. .t11        dc.b    "TRAP #11",0
  11584. .t12        dc.b    "TRAP #12",0
  11585. .t13        dc.b    "TRAP #13",0
  11586. .t14        dc.b    "TRAP #14",0
  11587. .t15        dc.b    "TRAP #15",0
  11588. .fbra        dc.b    "FP Branch or Set on Unordered Condition",0
  11589. .fir        dc.b    "FP Inexact Result",0
  11590. .fdiv        dc.b    "FP Divide by Zero",0
  11591. .fuf        dc.b    "FP Underflow",0
  11592. .foe        dc.b    "FP Operand Error",0
  11593. .fof        dc.b    "FP Overflow",0
  11594. .fnan        dc.b    "FP Signaling NAN",0
  11595. .fudt        dc.b    "FP Unimplemented Datatype",0        ;68040
  11596. .mmucfg        dc.b    "MMU Configuration Error",0        ;68030/68851
  11597. .51io        dc.b    "MMU Illegal Operation Error",0        ;68851
  11598. .51alv        dc.b    "MMU Access Level Violation Error",0    ;68851
  11599. .uea        dc.b    "Unimplemented Effective Address",0    ;68060
  11600. .ui        dc.b    "Unimplemented Integer Instruction",0    ;68060
  11601.  
  11602.         EVEN
  11603.  
  11604.  
  11605. *****************************************************************************
  11606. ;----------------------------------------
  11607. ; Berechnet String-Adresse über Zuordungstabelle
  11608. ; input :    D0 = WORD   value
  11609. ;        A0 = STRUCT Zuordnungstabelle
  11610. ; output :    D0 = CPTR   string or NULL
  11611.  
  11612. _DoStringNull
  11613. .start        cmp.w    (a0),d0            ;lower bound
  11614.         blt    .nextlist
  11615.         cmp.w    (2,a0),d0        ;upper bound
  11616.         bgt    .nextlist
  11617.         move.w    d0,d1
  11618.         sub.w    (a0),d1            ;index
  11619.         add.w    d1,d1            ;because words
  11620.         move.w    (8,a0,d1.w),d1        ;rptr
  11621.         beq    .nextlist
  11622.         add.w    d1,a0
  11623.         move.l    a0,d0
  11624.         rts
  11625.  
  11626. .nextlist    move.l    (4,a0),a0        ;next list
  11627.         move.l    a0,d1
  11628.         bne    .start
  11629.         
  11630.         moveq    #0,d0
  11631.         rts
  11632.  
  11633. ***********************************************************
  11634.  
  11635.         include src/format_block.s
  11636.         include src/custom_names.s
  11637.  
  11638. **************************************************************************
  11639. **************************************************************************
  11640. **************************************************************************
  11641.  
  11642.         cnop 0,16
  11643.  
  11644. inited        dc.l 0            ;<>$12345678 then never entered
  11645. registres    dcb.l 14,0        ;d0-d7,a0-a5
  11646. a6_reg        dc.l 0
  11647. a7_reg        dc.l 0
  11648. sr_reg        dc.w 0
  11649. pc_reg        dc.l 0
  11650. ssp_reg        dc.l 0
  11651. usp_reg        dc.l 0
  11652. vbr_reg        dc.l 0
  11653. cacr_reg    dc.l 0
  11654. caar_reg    dc.l 0        ; or BUSR on 68060
  11655. isp_reg        dc.l 0
  11656. msp_reg        dc.l 0        ; or PCR on 68060
  11657. tc_reg        dc.l 0
  11658. end_registres
  11659. itt0_reg    dc.l 0
  11660. itt1_reg    dc.l 0
  11661. dtt0_reg    dc.l 0
  11662. dtt1_reg    dc.l 0
  11663.  
  11664.         cnop 0,4
  11665.  
  11666. OldRaster    dc.l 0            ;old pos of raster beam
  11667.  
  11668. proc_type    dc.w 2            ;processor type 2=68020,...,6=68060
  11669.     ;keyboard ptr with/without SHIFT, ALT
  11670. board_ptr    dc.l board3,board4,board4a
  11671.  
  11672. ;-------------------------------------------
  11673.  
  11674. ascII_ptr    dc.l ascII_page1    ;ptr on actual ascII page
  11675.         dc.l ascII_page1    ;list of ptrs on all ascII pages
  11676.         dc.l ascII_page2
  11677.         dc.l ascII_Tracer
  11678.         dc.l 0            ;end signal for multi-print
  11679.  
  11680. Reset_Flag    dc.w 0            ;Copy of Action_GAL AND %100
  11681. trace_count    dc.w 0            ;nb of steps to trace
  11682. escape        dc.b 0            ;escape monitor signal
  11683. kill        dc.b 0            ;Kill cmd done
  11684. reboot        dc.b 0            ;Reboot cmd done
  11685. break_mode    dc.b 0            ;0=no break points -1 BP set
  11686. BP_reach    dc.b 0            ;entered from Illegal breakpoint
  11687. BPJ_reach    dc.b 0            ;entered from JSR breakpoint
  11688. BPatPC        dc.b 0            ;BP at PC -> need one trace step
  11689. trace_moni    dc.b 0            ;Tracer mode ON/OFF
  11690. cheat        dc.b 0            ;Can access Action-Replay area ?
  11691. cheat_cnt    dc.b 0            ;counter to enable cheat
  11692. pic_status    dc.b 0            ;0=low-mem ok. -1=pic in low-mem
  11693. VBL        dc.b 0            ;set to -1 at each VBL
  11694. packed        dc.b 0            ;used by LA_cmd
  11695. debug_entry    dc.b 0    ;1=bus,2=addr,3=illegal,4=zero,5=linea,6=linef
  11696.         cnop 0,4
  11697.  
  11698.  
  11699. ;-------------------------------------------
  11700.         cnop 0,4
  11701.  
  11702. last_cmd    dc.l cmd_list        ;keep last command
  11703. hex_ptr:    dc.l 0            ;ptr on last address shown as hexa
  11704. dis_ptr:    dc.l 0            ;ptr on last addr disassembled
  11705. asc_ptr        dc.l 0            ;same for ascII dump
  11706.  
  11707. time_repeat:    dc.w 0
  11708. time_cursor:    dc.w 0
  11709. cursor_x:    dc.w 0
  11710. cursor_y:    dc.w 0
  11711. old_cursor:    dc.l 0        ;cursor_xy backup for Tracer
  11712. print_cnt    dc.w 0        ;used in print procedure
  11713. ascII_num:    dcb.b 8,0
  11714. cursor_on:    dc.b 0        ;actual cursor state (displayed or not)
  11715. no_curs:    dc.b 0        ;disable cursor
  11716. key:        dc.b 0        ;actual key
  11717. key_prev:    dc.b $7f    ;previous key
  11718. shift_mode    dc.b 0        ;0=no shift key pressed
  11719. ctrl_mode    dc.b 0        ;0=no ctrl key pressed
  11720. alt_mode    dc.b 0        ;0=no alt key pressed
  11721. amiga_mode    dc.b 0        ;0=no amiga key pressed
  11722. insert_mode    dc.b 0        ;0=no insert -1=insert mode on
  11723. break        dc.b 0        ;break signal (ESC)
  11724. ascII_page    dc.b 0        ;0=page1, -1=page2
  11725.         even
  11726. nb_keys        dc.w 0
  11727. key_buffer    dcb.b 64,0
  11728. new_key        dc.b 0
  11729.         even
  11730.  
  11731. history_cnt    dc.w 0        ;last history
  11732. history_disp    dc.w 0        ;next displayed history
  11733. history        rept    16
  11734.         dcb.b 80,0
  11735.         endr        ;16 lines of history
  11736.  
  11737. command:    dcb.b 80+20,0        ;the actual command line is here
  11738.  
  11739. window_top    dc.w 0        ;top of actual window
  11740. window_bot    dc.w 0        ;bottom of actual window (last line)
  11741. screen_height    dc.w 22        ;nb max of lines (depending of resolution)
  11742.  
  11743.  
  11744. no_print    dc.b 0        ;if -1 then print won't write in the picture
  11745.                 ;memory, only in the ascII_page
  11746.  
  11747. disk_op        dc.b 0        ;-1 when a disk operation occures
  11748. floppy_op    dc.b 0        ;-1 when floppy operation occured (needs motor_off)
  11749. cmd_executed    dc.b 0        ;-1 when a command is executed
  11750. cmd_crashed    dc.b 0        ;-1 if command crashed
  11751.  
  11752.         cnop 0,4
  11753.  
  11754. ;-------------- strings which are modified ----------------
  11755. registre_txt
  11756. data0_reg    dc.b "D0=xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx "
  11757. data4_reg    dc.b "xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx",$a
  11758. addr0_reg    dc.b "A0=xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx "
  11759. addr4_reg    dc.b "xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx",$a
  11760. pc_txt        dc.b "PC=xxxxxxxx  "
  11761. ssp_txt        dc.b "SSP=xxxxxxxx "
  11762. usp_txt        dc.b "USP=xxxxxxxx "
  11763. vbr_txt        dc.b "VBR=xxxxxxxx "
  11764. sr_txt        dc.b "SR=xxxx "
  11765. rts_txt        dc.b "RTS=xxxxxxxx",$a
  11766. ISP_txt        dc.b "ISP=xxxxxxxx "
  11767. MSP_txt        dc.b "MSP=xxxxxxxx "
  11768. CACR_txt    dc.b "CACR=xxxxxxxx "
  11769. CAAR_txt    dc.b "CAAR=xxxxxxxx "
  11770. mc_txt        dc.b "MC68060",$a,0
  11771.  
  11772. hex_txt:
  11773.     dc.b "h $xxxxxxxx $xxxx $xxxx $xxxx $xxxx $xxxx $xxxx $xxxx $xxxx "
  11774. hex_txt2    dc.b "'                '",$a,0
  11775.  
  11776.         cnop 0,4
  11777. general_txt    dcb.b 80,0    ;can be used by anyone to output a line
  11778.         dc.b $a,0
  11779.         even
  11780.  
  11781. ev_line        dcb.b 80,0    ;evaluation output line (for any other use too)
  11782.         dc.b $a,0
  11783.  
  11784. ;-------------- Tracer variables ---------------------
  11785.         cnop 0,4
  11786. tracer_old_rts    dc.l 0        ;when skiping subroutine
  11787. tracer_addr    dcb.l MAX_SCREEN-10,-1    ;address disassembled on each line
  11788.                 ;of the tracer
  11789.  
  11790. actual_pos    dc.w -1,-1
  11791. tracer_refresh    dc.b 0
  11792. trace_bsr    dc.b 0
  11793.  
  11794. ;-------------- watch variables ----------------------
  11795. watch_txt    dcb.b 12," "
  11796.  
  11797. watch        dc.l 0            ;the thing to watch, ptr or val
  11798.  
  11799. ;-------------- output cmd variables -----------------
  11800.         cnop 0,4
  11801. output_start    dc.l 0
  11802. output_ptr    dc.l 0
  11803.  
  11804.         cnop 0,4
  11805.  
  11806. ;-------------- Q (cmp mem) cmd variables ------------
  11807.  
  11808. cmp_start    dc.l 0
  11809. cmp_end        dc.l 0
  11810. cmp_dest    dc.l 0
  11811.  
  11812. ;-------------- A (assemble) cmd variables -----------
  11813.  
  11814. ass_addr    dc.l 0        ;address parameter
  11815.  
  11816. ;-------------- AF cmd variables ---------------------
  11817.  
  11818. af_ptr        dc.l 0
  11819.  
  11820. ;-------------- O (fill mem) cmd variables -----------
  11821.  
  11822. fill_start    dc.l 0
  11823. fill_end    dc.l 0
  11824.  
  11825. ;-------------- E show custom registers --------------
  11826.  
  11827. custom_offset    dc.l 0
  11828.  
  11829. ;-------------- trainer variables --------------------
  11830.  
  11831. ts_size        dc.w -1            ;size used for searching .B .W .L
  11832.         cnop 0,4
  11833. ts_start    dc.l 0
  11834. ts_end        dc.l 0
  11835.  
  11836. tf_txt        dc.b "$xxxxxxxx ",0
  11837. ts_deep        dc.b 0            ;deep trainer mode on/off
  11838.         cnop 0,4
  11839.  
  11840. ;-------------- DEBUG cmd variables ------------------
  11841.         cnop 0,4
  11842.  
  11843. exc8        dc.l 0            ;backup of
  11844. excC        dc.l 0            ;exception
  11845. exc10        dc.l 0            ;vectors
  11846. exc14        dc.l 0            ;when
  11847. exc28        dc.l 0            ;in
  11848. exc2C        dc.l 0            ;debug mode
  11849.  
  11850. debug        dc.b 0            ;debug mode ON/OFF
  11851.  
  11852. ;-------------- F,FI,FIF cmds variable ---------------
  11853.         cnop 0,4
  11854.  
  11855. find_start    dc.l 0
  11856. find_end    dc.l 0
  11857. find_list    dcb.b 80,0
  11858.         dc.w 0
  11859.  
  11860.         cnop 0,4
  11861.  
  11862. ;-------------- RS,WS cmds variables -----------------
  11863.  
  11864. sec_addr    dc.l 0
  11865.  
  11866. strtsec        dc.w 0
  11867. nbsec        dc.w 0
  11868.  
  11869. rwsec        dc.b 0        ;'R' or 'W' (rs or ws cmd)
  11870.         cnop 0,4
  11871.  
  11872. ;-------------- T,TA (trace) cmds variable -----------
  11873.  
  11874. old_trace:    dc.l 0        ;old trace exception vector
  11875. trace_address:    dc.l -1        ;used by TA
  11876.  
  11877. ;-------------- C,CE (copy,exg mem) cmd variables ----
  11878.  
  11879. copy_start    dc.l 0
  11880. copy_end    dc.l 0
  11881. copy_dest    dc.l 0
  11882. exgc        dc.b 0            ;copy or exg ?
  11883.         cnop 0,4
  11884.  
  11885. ;-------------- variables used by read_number procedure ---
  11886.  
  11887. minus        dc.b 0
  11888. ok_numb        dc.b 0
  11889. label        dc.b 0            ;disable label recognition
  11890.         cnop 0,4
  11891.  
  11892. ;-------------- variables used for evaluation --------
  11893.  
  11894. exit_stack    dc.l 0            ;to restore stack after an error
  11895. muls_data    dc.l 0,0        ;used by muls32 procedure
  11896. divs_data    dc.l 0,0        ;used by divs32 procedure
  11897. eval_size    dc.w 0            ;size 0=.b 1=.w 3=.l
  11898.         cnop 0,4
  11899.  
  11900. ;-------------- 65816 CPU variables ------------------
  11901.  
  11902. fami_mode    dc.b 0        ;0=65802 -1=65816
  11903. fami_auto    dc.b 0        ;automatic switch on/off   0/-1
  11904.         cnop 0,4
  11905.  
  11906. ;-------------- breakpoint variables -----------------
  11907.  
  11908. illegal_except    dc.l 0        ;old illegal exception vector for BP
  11909. Break_Address    dc.l 0        ;keep address of BP when entering monitor
  11910. JB_save        dc.l 0,0    ;used by JSR_reach
  11911.  
  11912. break_list    rept 20            ;20 breakpoints max.
  11913.  
  11914.         dc.l 0            ;break address
  11915.         dc.w -1            ;old word
  11916.         dc.l -1            ;old address for jsr
  11917.         endr
  11918.  
  11919.         dc.l -1            ;end
  11920.         dc.w -1            ;
  11921.         dc.l -1            ;signals
  11922.         cnop 0,4
  11923.  
  11924. ;-------------- variable used by get_dkey procedure --
  11925.  
  11926. dkey        dc.b 0,0        ;direct key,olddkey
  11927. dkey_rep    dc.w 0            ;direct key,repeat
  11928. dkey_shift    dc.b 0            ;direct shift
  11929.         cnop 0,4
  11930.  
  11931. ;-------------- Floppy disk variables ----------------
  11932.  
  11933. old_head    dc.w 0,0,0,0        ;old pos of head (1 for each drive)
  11934.  
  11935. sectpos:    dc.w 0            ;nb sectors to read in access
  11936. startsec:    dc.w 0            ;offset of first sector in 1st track
  11937. oldsectpos:    dc.w 0
  11938. oldstartsec:    dc.w 0
  11939.  
  11940. drive_present    dc.b 0,0,0,0        ;floppy drive present
  11941.  
  11942. drive:        dc.w 3            ;selected floppy disk (3-6)
  11943. track:        dc.w 0,0,0,0        ;actual pos of head (1 for each drive)
  11944. OldAdk:        dc.w 0
  11945. writes:        dc.b 0            ;write floppy accesss ?
  11946. init:        dc.b 0            ;head pos initied ? (bits 3-6)
  11947. mot_on:        dc.b 0            ;motor on ? (bits 3-6)
  11948. ctrl:        dc.b 0            ;end access signal
  11949.  
  11950.         cnop 0,4
  11951.  
  11952. header:        dc.l $ff00000b        ;MFM header
  11953. format        dc.b 0
  11954. first_sauve    dc.b 0
  11955.         cnop 0,4
  11956.  
  11957. drive_err    dc.w 0
  11958.  
  11959.         cnop 0,4
  11960.  
  11961. buffer        dc.l 0            ;address of DMA disk buffer
  11962.  
  11963. ;-------------- IDE drive variables ------------------
  11964.  
  11965.         STRUCTURE IDE_info,0
  11966.         UWORD II_NbCyl
  11967.         UWORD II_NbHeads
  11968.         UWORD II_NbSecTrack
  11969.         UWORD II_MultSize        ;multiple block size
  11970.         LABEL II_SIZEOF
  11971.  
  11972. IDE_info0    dc.w 0        ;NbCyl
  11973.         dc.w 0        ;NbHeads
  11974.         dc.w 0        ;NbSecTrack
  11975.         dc.w 0        ;MultSize
  11976.  
  11977. IDE_info1    dc.w 0        ;NbCyl
  11978.         dc.w 0        ;NbHeads
  11979.         dc.w 0        ;NbSecTrack
  11980.         dc.w 0        ;MultSize
  11981.  
  11982.         even
  11983.  
  11984. ;-------------- part variables -----------------------
  11985.  
  11986.         cnop 0,4
  11987.  
  11988. floppy0:    dc.l 0
  11989.         dc.l 0
  11990.         dc.l 1760
  11991.         dc.l floppy_device
  11992.         dc.w 0            ;unit
  11993.         dc.b 0,0,0,0        ;for DOS\1,2,3,...
  11994.         dc.b 3,"DF0"
  11995.         dcb.b 32-4,0
  11996.         dcb.b 32,0
  11997. floppy1:    dc.l 0
  11998.         dc.l 0
  11999.         dc.l 1760
  12000.         dc.l floppy_device
  12001.         dc.w 1            ;unit
  12002.         dc.b 0,0,0,0        ;for DOS\1,2,3,...
  12003.         dc.b 3,"DF1"
  12004.         dcb.b 32-4,0
  12005.         dcb.b 32,0
  12006.  
  12007.         rept 16            ;16 harddisk partition max
  12008.         dc.l 0
  12009.         dc.l 0
  12010.         dc.l 0
  12011.         dc.l 0
  12012.         dc.w 0            ;unit
  12013.         dc.b 0,0,0,0        ;for DOS\1,2,3,...
  12014.         dcb.b 32,0
  12015.         dcb.b 32,0
  12016.         endr
  12017. harddisk_end
  12018.  
  12019.  
  12020. ;-------------- track buffer to speedup floppy access -----
  12021.  
  12022. track_buffer    dcb.b 512*11    ;track buffer (11 sectors)
  12023. track_buffer_no    dc.w -1        ;no of track in track_buffer (0-159)-1=empty
  12024. track_sector    dcb.b 12,-1    ;-1 if sector of track_buffer isn't loaded
  12025.                 ;(12 values instead of 11 for easier clear)
  12026. flush_needed    dc.b 0
  12027.         cnop 0,4
  12028.  
  12029.  
  12030. ;------------------------------------------------
  12031.  
  12032. ascII_page1    ascII_mac "Page_1"
  12033. ascII_page2    ascII_mac "Page_2"
  12034. ascII_Tracer    ascII_mac "Tracer"
  12035.  
  12036. ;------------------------------------------------
  12037.         cnop 0,4
  12038.  
  12039. custom        dcb.w $100,0        ;copy of custom $DFF000-$DFF1FE
  12040.  
  12041. CIAA        dcb.b 16,0
  12042. CIAB        dcb.b 16,0
  12043.  
  12044. palette
  12045. paletteH    dcb.w 8*32,0        ;High bits
  12046. paletteL    dcb.w 8*32,0        ;Low bits
  12047.  
  12048. ;------------------------------------------------
  12049.  
  12050. fbuf1        rept nb_fbuf
  12051.         dcb.b 512,0        ;file buffers
  12052.         endr
  12053.  
  12054. crash_stack    dcb.b $100,0
  12055.  
  12056. backup_vbr    dcb.b $400,0        ;backup of vector table (before HRTmon installation)
  12057.  
  12058. backup_pic    dcb.b PICSIZE,0        ;backup of pic mem
  12059. backup_dma    dcb.b $1a00*2,0        ;backup of floppy disk dma buffer
  12060.  
  12061. ;------------------------------------------------
  12062.         cnop 0,4
  12063.  
  12064. tmp_mem_size    equ $8000
  12065. tmp_mem        dcb.b tmp_mem_size,0
  12066.  
  12067. ;tmp_mem is used by:
  12068. ; - Trainer commands
  12069. ; - copy command (copy a file)
  12070. ; - d2f command (disk to file) (uses 512*11 first bytes)
  12071. ; - f2d command (file to disk) (uses 512*11 first bytes)
  12072. ; - sa command (save all)
  12073. ; - la command (load all)
  12074. ; - sp command (save picture)
  12075.  
  12076. ;(!Trainer buffer can be erased by one of these commands!)
  12077.  
  12078.         dcb.b $800,0    ;stack area
  12079. stack
  12080.  
  12081. end
  12082.  
  12083. ;--------------------------------------------------------------------
  12084.  
  12085. ;max floppy filesize=1730*512=885760
  12086.  
  12087.